如何使用xslt更改简单的xml层次结构?

时间:2013-06-28 08:27:37

标签: xml xslt

我有以下源xml:

<to id="abc">
   <ti></ti>
   <b>
   ...
       <to id="bcd"><ti></ti><b>...</b></to>
       <to id="cde"><ti></ti><b>...</b></to>
       <to id="def"><ti></ti><b>...</b></to>
   </b>
</to>

“......”表示很多bodydiv li和nodetext。

我想将其转换为:

<to id="abc">
    <ti></ti>
    <b>
     ...
    </b>
    <to id="bcd"><ti></ti><b>...</b></to>
    <to id="cde"><ti></ti><b>...</b></to>
    <to id="def"><ti></ti><b>...</b></to>
 </to>

在xslt中表达转换的最简单方法是什么?

2 个答案:

答案 0 :(得分:0)

以下应该做的,它使用身份转换模板来复制所有内容并添加两个模板,第一个用于处理to[@id = 'abc']元素,第二个用于处理其b子元素:

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
  <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="to[@id = 'abc']">
  <xsl:copy>
    <xsl:apply-templates select="@* | node() | b/to[@id]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="to[@id = 'abc']/b">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()[not(self::to[@id])]"/>
  </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

您似乎只在to之外移动b。不确定为什么你需要在@id上建立任何基础。

请改为尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="b">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::to)]"/>
        </xsl:copy>
        <xsl:apply-templates select="to"/>
    </xsl:template>

</xsl:stylesheet>