XSLT:从另一个表中获取一个表上for循环中的row元素
我的XML文件中有三个表: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的值 目前,我正在
tableX
、tableA
和tableB
这是我的算法:
- 检查
的每一行元素,并检查tableX
是否为Xelement1
(空)NULL
- 如果匹配:
- 检查
中的每一行,并将行元素表格A
的值与Aelement2
表格X的另一行元素
进行比较Xelement2
- 如果匹配:
- 检查
的每一行元素,并将tableB
tableB的行元素
的值与Belement1
tableA的行元素
的值进行比较Aelement1
- 如果匹配:
- 打印表B的另一行元素
的值Belement2
- 打印表B的另一行元素
- 检查
- 检查
<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"/> 
</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
<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 = '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 = '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"/> 
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
[...]
>
>
>
>
>
>
>
>
实际上,它确实起作用。如果你真的想和我做点什么