XSLT:如何从 <Node id=$variable> 获取值



,所以我想从存储在$ 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>

最新更新