,所以我想从存储在$ variable中的ID参数的节点中获取子节点值。
XML代码模式:
<DocumentVersion id="not_relevant">
<Specification id="id_2000_2">
<Terminal id="not_relevant">
<Name>Name1</Name>
<Size>Size1</Size>
</Terminal>
</Specification>
<Specification id="id_2000_0">
<Node id="not_relevant">
<Subnode id="not_relevant">
<SubnodeNumber>1</SubnodeNumber>
<SubnodeSpecification>id_2000_2</SubnodeSpecification>
</Subnode>
<Subnode id="not_relevant">
<SubnodeNumber>2</SubnodeNumber>
<SubnodeSpecification>id_2000_3</SubnodeSpecification>
</Subnode>
<Subnode id="not_relevant">
<SubnodeNumber>1</SubnodeNumber>
<SubnodeSpecification>id_2000_2</SubnodeSpecification>
</Subnode>
</Node>
</Specification>
<Specification id="id_2000_3">
<Terminal id="not_relevant">
<Name>Name2</Name>
<Size>Size2</Size>
</Terminal>
</Specification>
</DocumentVersion>
XSLT代码(包括html表标签,但您明白了(:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.1">
<xsl:output method="html" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="//Subnode[@id]">
<tr>
<td>
<xsl:value-of select="position()"/>
</td>
<td>
<xsl:value-of select="SubnodeNumber"/>
</td>
<xsl:variable name="specid" select="SubnodeSpecification"/>
<td>
<xsl:value-of select="$specid"/>
</td>
<td>
<xsl:for-each select="//Specification[@id=$specid]">
<xsl:value-of select="//Size"></xsl:value-of>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="//Specification[@id=$specid]">
<xsl:value-of select="//Name"></xsl:value-of>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在两个输出中仔细查看第2行。目前,我总是得到size1和name1。$ SPECID包含正确的ID,但XSLT以某种方式看到ID_2000_2的值。
当前输出:
<SubnodeNumber> $specid <Size> <Name>
1 id_2000_2 Size1 Name1
2 id_2000_3 Size1 Name1
3 id_2000_2 Size1 Name1
所需的输出:
<SubnodeNumber> $specid <Size> <Name>
1 id_2000_2 Size1 Name1
2 id_2000_3 Size2 Name2
3 id_2000_2 Size1 Name1
您的示例数据的形成不佳,它错过了两个关闭标签。
另外,似乎不一致,您的ID_2000_2两次,但数据中没有ID_2000_3。
假设这些问题已解决,您可以通过更换
来修复样式表 <xsl:value-of select="//Name"></xsl:value-of>
<xsl:value-of select=".//Name"></xsl:value-of>
或
<xsl:value-of select="Terminal/Name"></xsl:value-of>
(从您的for-EATH中的当前上下文节点开始选择(。
为了从当前内容中选择名称元素。
完整XML:
<DocumentVersion id="not_relevant">
<Specification id="id_2000_2">
<Terminal id="not_relevant">
<Name>Name1</Name>
<Size>Size1</Size>
</Terminal>
</Specification>
<Specification id="id_2000_0">
<Node id="not_relevant">
<Subnode id="not_relevant">
<SubnodeNumber>1</SubnodeNumber>
<SubnodeSpecification>id_2000_2</SubnodeSpecification>
</Subnode>
<Subnode id="not_relevant">
<SubnodeNumber>2</SubnodeNumber>
<SubnodeSpecification>id_2000_3</SubnodeSpecification>
</Subnode>
<Subnode id="not_relevant">
<SubnodeNumber>1</SubnodeNumber>
<SubnodeSpecification>id_2000_2</SubnodeSpecification>
</Subnode>
</Node> <!-- Changed -->
</Specification>
<Specification id="id_2000_3"> <!-- Changed -->
<Terminal id="not_relevant">
<Name>Name2</Name>
<Size>Size2</Size>
</Terminal>
</Specification>
完整XSLT:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
<xsl:output method="html" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="//Subnode[@id]">
<tr>
<td>
<xsl:value-of select="position()"/>
</td>
<td>
<xsl:value-of select="SubnodeNumber"/>
</td>
<xsl:variable name="specid" select="SubnodeSpecification"/>
<td>
<xsl:value-of select="$specid"/>
</td>
<td>
<xsl:for-each select="//Specification[@id=$specid]">
<xsl:value-of select=".//Size"></xsl:value-of>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="//Specification[@id=$specid]">
<xsl:value-of select=".//Name"></xsl:value-of>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出:
<tr>
<td>1</td>
<td>1</td>
<td>id_2000_2</td>
<td>Size1</td>
<td>Name1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>id_2000_3</td>
<td>Size2</td>
<td>Name2</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>id_2000_2</td>
<td>Size1</td>
<td>Name1</td>
</tr>