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