XSLT:从另一个表中获取一个表上for循环中的row元素

XSLT:从另一个表中获取一个表上for循环中的row元素,xslt,xslt-2.0,Xslt,Xslt 2.0,我的XML文件中有三个表:tableX、tableA和tableB 这是我的算法: 检查tableX的每一行元素,并检查Xelement1是否为NULL(空) 如果匹配: 检查表格A中的每一行,并将行元素Aelement2的值与表格X的另一行元素Xelement2进行比较 如果匹配: 检查tableB的每一行元素,并将tableB的行元素Belement1的值与tableA的行元素Aelement1的值进行比较 如果匹配: 打印表B的另一行元素Belement2的值 目前,我正在

我的XML文件中有三个表:
tableX
tableA
tableB

这是我的算法:

  • 检查
    tableX
    的每一行元素,并检查
    Xelement1
    是否为
    NULL
    (空)
  • 如果匹配:
    • 检查
      表格A
      中的每一行,并将行元素
      Aelement2
      的值与
      表格X的另一行元素
      Xelement2
      进行比较
    • 如果匹配:
      • 检查
        tableB
        的每一行元素,并将
        tableB的行元素
        Belement1
        的值与
        tableA的行元素
        Aelement1
        的值进行比较
      • 如果匹配:
        • 打印表B的另一行元素
          Belement2
          的值
目前,我正在这样做,它正在工作:

<xsl:for-each select="/root/table[@name='tableX']/row">
  <xsl:variable name="rec" select="."/>
  <xsl:choose>
    <xsl:when test="Xelement1=''">
      <xsl:for-each select="/root/table[@name='tableA']/row">
        <xsl:variable name="member" select="."/>
        <xsl:if test="Aelement2=$rec/Xelement2">
          <xsl:for-each select="/root/table[@name='tableB']/row">
            <xsl:if test="Belement1=$member/Aelement1">
              <xsl:value-of select="Belement2"/>&#160
            </xsl:if>
          </xsl:for-each>
        </xsl:if>
      </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
      <!-- Xelement1 is not null -->
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each>
最小但完整的XML示例:

<root>
    <table name="tableX">
      <row>
        <Xelement1>11</Xelement1>
        <Xelement2>3</Xelement2>
        <Xother>failure</Xother>
      </row>
      <row>
        <Xelement1>NULL</Xelement1>
        <Xelement2>9</Xelement2>
        <Xother>success</Xother>
      </row>
  </table>
  <table name="tableA">
    <row>
      <Aelement1>10</Aelement1>
      <Aelement2>16</Aelement2>
      <Aother>failure</Aother>
    </row>
    <row>
      <Aelement1>12</Aelement1>
      <Aelement2>9</Aelement2>
      <Aother>success</Aother>
    </row>
    <row>
      <Aelement1>12</Aelement1>
      <Aelement2>16</Aelement2>
      <Aother>failure</Aother>
    </row>
    <row>
      <Aelement1>14</Aelement1>
      <Aelement2>9</Aelement2>
      <Aother>success</Aother>
    </row>
  </table>
  <table name="tableB">
    <row>
      <Belement1>10</Belement1>
      <Belement2>failure</Belement2>
      <Bother>random</Bother>
    </row>
    <row>
      <Belement1>12</Belement1>
      <Belement2>success</Belement2>
      <Bother>random</Bother>
    </row>
    <row>
      <Belement1>14</Belement1>
      <Belement2>success</Belement2>
      <Bother>random</Bother>
    </row>
  </table>
</root>

11
3.
失败
无效的
9
成功
10
16
失败
12
9
成功
12
16
失败
14
9
成功
10
失败
随机的
12
成功
随机的
14
成功
随机的
我会定义一个键

<xsl:key name="row" match="table[@name = 'tableB']/row" use="Belement"/>

然后你可以缩短

<xsl:for-each select="/root/table[@name='tableA']/row">
  <xsl:variable name="member" select="."/>
  <xsl:for-each select="/root/table[@name='tableB']/row">
    <xsl:if test="Belement=$member/Aelement">
      <!--Do something-->
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>


至于术语,您的代码处理
元素
元素节点

至于不起作用的示例,您需要向我们展示XML输入、XSLT代码、您想要的结果、您得到的结果的最小但完整的示例,以便我们可以轻松地重现问题。

我将定义一个键

<xsl:key name="row" match="table[@name = 'tableB']/row" use="Belement"/>

然后你可以缩短

<xsl:for-each select="/root/table[@name='tableA']/row">
  <xsl:variable name="member" select="."/>
  <xsl:for-each select="/root/table[@name='tableB']/row">
    <xsl:if test="Belement=$member/Aelement">
      <!--Do something-->
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>


至于术语,您的代码处理
元素
元素节点

至于不起作用的示例,您需要向我们展示XML输入、XSLT代码、您想要的结果、您得到的结果的最小但完整的示例,以便我们可以轻松地重现问题。

我将定义一个键

<xsl:key name="row" match="table[@name = 'tableB']/row" use="Belement"/>

然后你可以缩短

<xsl:for-each select="/root/table[@name='tableA']/row">
  <xsl:variable name="member" select="."/>
  <xsl:for-each select="/root/table[@name='tableB']/row">
    <xsl:if test="Belement=$member/Aelement">
      <!--Do something-->
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>


至于术语,您的代码处理
元素
元素节点

至于不起作用的示例,您需要向我们展示XML输入、XSLT代码、您想要的结果、您得到的结果的最小但完整的示例,以便我们可以轻松地重现问题。

我将定义一个键

<xsl:key name="row" match="table[@name = 'tableB']/row" use="Belement"/>

然后你可以缩短

<xsl:for-each select="/root/table[@name='tableA']/row">
  <xsl:variable name="member" select="."/>
  <xsl:for-each select="/root/table[@name='tableB']/row">
    <xsl:if test="Belement=$member/Aelement">
      <!--Do something-->
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>


至于术语,您的代码处理
元素
元素节点


对于不起作用的示例,您需要向我们展示XML输入、XSLT代码、您想要的结果、您得到的结果的最小但完整的示例,以便我们可以轻松地重现问题。

您应该能够使用单个XPath表达式从表B中选择相应的行:

<xsl:for-each select="/root/table[@name = 'tableB']/row[
  Belement = /root/table[@name = 'tableA']/row/Aelement
]">
  <!-- Do something -->
</xsl:for-each>
将从示例中选择包含
“success”
的元素

从里到外阅读:

  • tableX
    行的
    Xelement1='NULL'
    中,您需要
    Xelement2
  • 表A
    行中,其中
    Aelement2
    对应于您想要的
    Aelement1
  • 表B
    行中,其中
    Belement1
    对应于您想要的
    Belement2

您应该能够使用单个XPath表达式从表B中选择相应的行:

<xsl:for-each select="/root/table[@name = 'tableB']/row[
  Belement = /root/table[@name = 'tableA']/row/Aelement
]">
  <!-- Do something -->
</xsl:for-each>
将从示例中选择包含
“success”
的元素

从里到外阅读:

  • tableX
    行的
    Xelement1='NULL'
    中,您需要
    Xelement2
  • 表A
    行中,其中
    Aelement2
    对应于您想要的
    Aelement1
  • 表B
    行中,其中
    Belement1
    对应于您想要的
    Belement2

您应该能够使用单个XPath表达式从表B中选择相应的行:

<xsl:for-each select="/root/table[@name = 'tableB']/row[
  Belement = /root/table[@name = 'tableA']/row/Aelement
]">
  <!-- Do something -->
</xsl:for-each>
将从示例中选择包含
“success”
的元素

从里到外阅读:

  • tableX
    行的
    Xelement1='NULL'
    中,您需要
    Xelement2
  • 表A
    行中,其中
    Aelement2
    对应于您想要的
    Aelement1
  • 表B
    行中,其中
    Belement1
    对应于您想要的
    Belement2

您应该能够使用单个XPath表达式从表B中选择相应的行:

<xsl:for-each select="/root/table[@name = 'tableB']/row[
  Belement = /root/table[@name = 'tableA']/row/Aelement
]">
  <!-- Do something -->
</xsl:for-each>
将从示例中选择包含
“success”
的元素

从里到外阅读:

  • tableX
    行的
    Xelement1='NULL'
    中,您需要
    Xelement2
  • 表A
    行中,其中
    Aelement2
    对应于您想要的
    Aelement1
  • 表B
    行中,其中
    Belement1
    对应于您想要的
    Belement2
还有,为什么这不起作用

    [...]
      <xsl:for-each select="/root/table[@name='tableA']/row">
        <xsl:variable name="member" select="Aelement1"/>
        <xsl:if test="Aelement2=$rec/Xelement2">
          <xsl:for-each select="/root/table[@name='tableB']/row">
            <xsl:if test="Belement1=$member">
              <xsl:value-of select="Belement2"/>&#160
            </xsl:if>
          </xsl:for-each>
        </xsl:if>
      </xsl:for-each>
    [...]
>
>      
>   
>     
>       
>     
>   
> 
实际上,它确实起作用。如果你真的想和我做点什么