1

我有一个输入 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(例如“<theirelement id="<xslt:...>” >" 我找到了一种使用 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>

然而,生成的输出不包含“<theirelement ...”,而是“<theirelement ...”。我需要输出实际包含“<”而不是“<” (“>”和“>”也是如此)。

顺便说一句,原因是因为此过程的输出是某些程序的输入,当标记转义为“<tag>”时,该程序无法读取 xml。

任何帮助将不胜感激!

4

2 回答 2

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>
于 2013-08-26T13:52:22.720 回答
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 引用中查找它。

于 2013-08-26T15:36:41.753 回答