我有一个简单的xml:
<A>
<b>
<c att="1">TEXT <d>some other text</d></c>
</b>
<c att="1">TEXT 2</c>
</A>
我想将其转换为:
<A>
<p>
<span class="1">TEXT <d>some other text</d></span>
</p>
<span class="1">TEXT 2</span>
</A>
如何通过XSLT转换完成此操作?
我尝试过这个xslt
<xsl:template match="b">
<xsl:element name="p">
<xsl:copy-of select="node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="c">
<span>
<xsl:attribute name="class">
<xsl:value-of select="@att"/>
</xsl:attribute>
</span>
</xsl:template>
这个结果
<A>
<p>
<c att="1">TEXT <d>some other text</d></c>
</p>
<span class="1">TEXT 2</span>
</A>
答案 0 :(得分:0)
如你所说,这个例子确实很基本。
转换必须执行以下更改:
第一个任务执行模板匹配 b 元素。
第二个 - 模板匹配 c 元素。
第3个任务执行指令<xsl:attribute name="class" select="@att"/>
。
要防止原始att
属性在输出中复制,
嵌入式apply-templates
仅在覆盖的后代节点上执行
node()
函数,不包含属性。
下面有一个完整的例子。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="b">
<p><xsl:apply-templates select="@*|node()"/></p>
</xsl:template>
<xsl:template match="c">
<xsl:element name="span">
<xsl:attribute name="class" select="@att"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:transform>