在XSLT中转义xml标记

时间:2013-08-26 13:31:46

标签: xml xslt xml-parsing escaping

我有一个输入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。

非常感谢任何帮助!

2 个答案:

答案 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引用中查找它。