访问xsl中的节点

时间:2017-02-27 11:25:20

标签: xslt

我刚刚开始使用xsl。下面将描述我想要完成的事情,并希望有人可以提供帮助。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:GetSkillResponse>
    <ns1:Skill>
        <ns1:Person>
            <ns1:SkillId>001</ns1:SkillId>
        </ns1:Person>
        <ns1:Task Active="N">Value 1</ns1:Task>
        <ns1:Task Active="Y">Value 2</ns1:Task>
        <ns1:Task Active="Y">Value 3</ns1:Task>
    </ns1:Skill>
    <ns1:Skill>
        <ns1:Person>
            <ns1:SkillId>002</ns1:SkillId>
        </ns1:Person>
        <ns1:Task Active="Y">Value 1</ns1:Task>
        <ns1:Task Active="Y">Value 2</ns1:Task>
        <ns1:Task Active="Y">Value 3</ns1:Task>
    </ns1:Skill>
</ns1:GetSkillResponse>

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ns1="http://test">
    <xsl:template name="GetSkillResponse">
        <Message>
            <xsl:for-each select="/ns1:GetSkillResponse/ns1:Skill">
                <PropertySet>
                    <xsl:attribute name="MySkillId"><xsl:value-of select="ns1:Person/ns1:SkillId"/></xsl:attribute>
                    <xsl:attribute name="MyTask"><xsl:value-of select="ns1:Task"/></xsl:attribute>
                    <xsl:attribute name="MyActiveFlag"><xsl:value-of select="ns1:Task/@Active"/></xsl:attribute>
                </PropertySet>
            </xsl:for-each>
        </Message>
    </xsl:template>
</xsl:stylesheet>

这让我:
001,值1,N
002,值1,Y

但我需要得到:
001,值1,N
001,值2,Y
001,Value 3,Y
002,价值1,Y
002,价值2,Y
002,价值3,Y

这可能吗?

1 个答案:

答案 0 :(得分:0)

看起来你想为Task下的每个Skill元素单独输入一个条目,为此,只需要一个嵌套的xsl:for-each

例如......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://test">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <xsl:call-template name="GetSkillResponse" />
    </xsl:template>

    <xsl:template name="GetSkillResponse">
        <Message>
            <xsl:for-each select="/ns1:GetSkillResponse/ns1:Skill">
                <xsl:for-each select="ns1:Task">
                    <PropertySet>
                        <xsl:attribute name="MySkillId"><xsl:value-of select="../ns1:Person/ns1:SkillId"/></xsl:attribute>
                        <xsl:attribute name="MyTask"><xsl:value-of select="."/></xsl:attribute>
                        <xsl:attribute name="MyActiveFlag"><xsl:value-of select="@Active"/></xsl:attribute>
                    </PropertySet>
                </xsl:for-each>
            </xsl:for-each>
        </Message>
    </xsl:template>
</xsl:stylesheet>

请注意,您可以使用Attribute Value Templates

简化此操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://test">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <xsl:call-template name="GetSkillResponse" />
    </xsl:template>

    <xsl:template name="GetSkillResponse">
        <Message>
            <xsl:for-each select="/ns1:GetSkillResponse/ns1:Skill">
                <xsl:for-each select="ns1:Task">
                    <PropertySet MySkillId="{../ns1:Person/ns1:SkillId}" MyTask="{.}" MyActiveFlag="{@Active}"/>
                </xsl:for-each>
            </xsl:for-each>
        </Message>
    </xsl:template>
</xsl:stylesheet>