在XSL转换中定位属性

时间:2013-11-27 14:24:47

标签: xml xslt transform

我有以下xml:

<Head>
    <Group1>
        <Ref>
            <RefType>ABC123</RefType>
            <RefIdentifier>123456789</RefIdentifier>
            <RefDate>2013-11-30</RefDate>
        </Ref>
    </Group1>
    <Group2>
        <UOM>
            <UOMType>XYZ789</UOMType>
            <UOMIdentifier>BlahBlah</UOMIdentifier>
        </UOM>
    </Group2>
    <Group3>
        <Rec>
            <RecType>XYZ789</RecType>
            <RecIdentifier>HalbHalb</RecIdentifier>
        </Rec>
    </Group3>
</Head>

我需要转变为:

<Head>
    <Ref>
      <Identifier type="ABC123">123456789</Identifier>
      <RefDate>2013-11-30</RefDate>
    </Ref>
    <UOM>
      <Identifier type="XYZ789">BlahBlah</Identifier>
    </UOM>
    <Rec>
      <Identifier type="XYZ789">HalbHalb</Identifier>
    </Rec>
</Head>

使用xslt。到目前为止,我有以下内容:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="/Head"/>
    </xsl:template>



    <xsl:template match="Head">
        <Head>
            <xsl:for-each select="Group1/Ref">
                <Ref>
                    <Identifier><xsl:value-of select="RefIdentifier"/></Identifier>
                    <RefDate><xsl:value-of select="RefDate"/></RefDate> 
                </Ref>
            </xsl:for-each>
            <xsl:for-each select="Group2/UOM">
                <UOM>
                    <Identifier><xsl:value-of select="UOMIdentifier"/></Identifier> 
                </UOM>
            </xsl:for-each>
            <xsl:for-each select="Group3/Rec">
                <Rec>
                    <Identifier><xsl:value-of select="RecIdentifier"/></Identifier> 
                </Rec>
            </xsl:for-each>
        </Head>
    </xsl:template>

</xsl:stylesheet>

给了我

<Head>
    <Ref>
        <Identifier>123456789</Identifier>
        <RefDate>2013-11-30</RefDate>
    </Ref>
    <UOM>
        <Identifier>BlahBlah</Identifier>
    </UOM>
    <Rec>
        <Identifier>HalbHalb</Identifier>
    </Rec>
</Head>

但我不知道如何在Ref,UOM和Rec标签的'Identifier'标签中获取'type'属性及其值。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

  

但我不知道如何获取'type'属性及其值   Ref,UOM和Rec标签的'Identifier'标签。我怎么能这样做?

使用:

<Identifier type="{RefType}"><xsl:value-of select="RefIdentifier"/></Identifier>

花括号是一个属性值模板,它允许您在其中替换XPath表达式的值。它们仅允许在XSLT样式表中的某些属性值中使用,但使用它们的一个常见位置是文字结果元素。

仅供参考:RefUOMRec不是“标签”,而是元素。它们使用开始和结束标记进行序列化,但XSLT不对标记进行操作;它运作在元素上。用标签来思考和谈论它们就像是说“我欠史蒂夫的手5美元”而不是“我欠史蒂夫5美元”。我并不是想要迂腐,而是将XML视为节点树,其中每个元素都是单个节点而不是两个独立的标签,这将有助于您更好地理解样式表的工作方式。 XSLT将树转换为另一个树,并且仅在样式表完成后才会将序列化转换为标记;有时,XSLT甚至无法控制序列化。

答案 1 :(得分:0)

使用attribute标记:

<Identifier>
  <xsl:attribute name="type"><xsl:value-of select="RefType"/></xsl:attribute>
  <xsl:value-of select="RefIdentifier"/>
</Identifier>

这会将类型作为属性插入。