我有一个输入xml,比如说:
<myxml>
<myelement id="1" />
<myelement id="2" />
<myelement id="3" />
</myxml>
我想创建一个XSLT来创建一个不同形式的输出xml,比如说:
<theirxml>
<theirelement id="1" />
<theirelement id="2" />
<theirelement id="3" />
</theirxml>
因为我无法在标签内创建带标签的xslt(例如“&lt; theirelement id =”&lt; xslt:...&gt;“&gt;”我找到了一种方法来使用CDATA进行如下操作(仅显示xslt的相关部分):
<xsl:for-each select="myxml/myelement">
<xsl:text><![CDATA[<theirelement id="]]></xsl:text><xsl:value-of select="@name" /><xsl:text><![CDATA[" />]]></xsl:text>
</xsl:for-each>
然而,产生的输出不包含“&lt; theirelement ...”而是“&amp; lt; theirelement ...”。我需要输出实际包含“&lt;”而不是“&amp; lt;” (同样适用于“&gt;”和“&amp; gt;”)。
原因,顺便说一下,是因为此过程的输出是某些程序的输入,当标签被转义为“&amp; lt; tag&amp; gt;”时,该程序无法读取xml。
非常感谢任何帮助!
答案 0 :(得分:2)
这是一个执行所需转换的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" method="xml"/>
<xsl:template match="/">
<myxml>
<xsl:apply-templates/>
</myxml>
</xsl:template>
<xsl:template match="myelement">
<theirelement>
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</theirelement>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
来自@ fred02138的解决方案可简化为:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" method="xml"/>
<xsl:template match="/">
<myxml>
<xsl:apply-templates/>
</myxml>
</xsl:template>
<xsl:template match="myelement">
<theirelement id="{@id}"/>
</xsl:template>
</xsl:stylesheet>
花括号中的构造是一个“属性值模板”,以防你想在XSLT引用中查找它。