将一个子节点转换为属性

时间:2014-05-12 07:25:52

标签: xml xslt

我对XML转换很陌生,所以我希望有人可以帮助我。

这就是:我有一个带有一组子节点的节点。其中一个需要转换为属性,而其他的应该保持原样。 我的样式表(或者更确切地说,我的部分模板)如下所示:

<xsl:template match="headerType">
  <headerType>
    <!--      <xsl:for-each select="./status">
      <xsl:attribute name="{name()}">
        <xsl:value-of select="text()"/>
      </xsl:attribute>
    </xsl:for-each>-->
    <xsl:for-each select="headerType/*">
      <xsl:choose>
        <xsl:when test="name()='status'">
          <xsl:attribute name="{name()}">
            <xsl:value-of select="text()"/>
          </xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy>
            <!--<xsl:apply-templates select="@*|node()"/>-->
          </xsl:copy>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </headerType>
</xsl:template>

应该转换自:

<headerType>
    <status>request</status>
    ---more child nodes here---
</headerType>

要:

<headerType status="request">
    ---the rest of the child nodes form headerType here---
</headerType>

但此刻,它只是完全削减了地位。 我想知道我在这里做错了什么?此外,建议阅读有关XML转换/样式表如何工作的一些阅读。 我也想知道如何控制运行哪个模板,因为我有一些其他模板可以删除某些节点(标签?),这些模块突然停止为headerType及其子节点工作。因此,如果我知道如何控制xsl:templates运行的顺序,那就太好了: - )

1 个答案:

答案 0 :(得分:0)

在模板中使用name()将返回'headerType',即模板应用的节点名称。这就是它无法正常工作的原因。

为什么不直接检索节点,如下所示:

<headerType>
    <xsl:attribute name="status">
        <xsl:value-of select="status"/>
    </xsl:attribute>
    <xsl:copy-of select="./*[local-name() != 'status']"/>
</headerType> 

将模板应用于<headerType>

中的其他节点时,您可以过滤掉该状态节点

我相信您可以使用模板上的'priority'属性来定义订单,但我以前从未使用它(实际上从不需要)。 This tutorial似乎很好地讨论了模板的顺序/优先级。或者只是Google it;)