XSLT如何从不同的标记级别访问属性?

时间:2018-07-31 08:42:01

标签: xml xslt xslt-1.0 xslt-2.0

我是xsl和xslt的新手。我正在使用xslt进行xml到xml的转换。我有下面的xml文件。我使用for-each循环遍历REQ-IF / record,并且在循环内要迭代REQ-IF / Attributes / Attribute以访问@Name值。我尝试使用../,但它仅提供一个上一级的值,并且不允许我进行迭代。你能帮我这个忙吗?谢谢。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<REQ-IF>
    <record>
        <Name>ABC</Name>
        <Presentationname>Task Record</Presentationname>
        <GUID>123</GUID>
    </record>
    <record>
        <Name>DEF</Name>
        <Presentationname>Role Record</Presentationname>
        <GUID>456</GUID>
    </record>
    <record>
        <Name>GHI</Name>
        <Presentationname>WorkProduct Record</Presentationname>
        <GUID>789</GUID>
    </record>
    <Attributes>
        <Attribute>
            <Name>Task</Name>
        </Attribute>
        <Attribute>
            <Name>Role</Name>
        </Attribute>
        <Attribute>
            <Name>WorkProduct</Name>
        </Attribute>
    </Attributes>
</REQ-IF>

1 个答案:

答案 0 :(得分:2)

可行

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/REQ-IF">
        <xsl:for-each select="record">
            <xsl:text>&#x0A;</xsl:text>
            <xsl:value-of select="./Name"/>
            <xsl:for-each select="../Attributes/Attribute">
                <xsl:text>&#x0A;&#x09;</xsl:text>
                <xsl:value-of select="Name"/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出:

ABC
    Task
    Role
    WorkProduct
DEF
    Task
    Role
    WorkProduct
GHI
    Task
    Role
    WorkProduct

在嵌套循环中,您可能使用的是for-each select =“ ../ Attributes”而不是for-each select =“ ../ Attributes / Attribute”。由于REQ-IF只有一个“属性”节点,所以只有一个结果。