0

我有以下源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 中表达转换的最简单方法是什么?

4

2 回答 2

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>
于 2013-06-28T10:01:52.847 回答
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>
于 2013-06-28T16:28:56.200 回答