0

输入xml:

<Parent>
    <Child attr="thing">stuff</Child>
</Parent>

xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="Child">
        <newChild chars="{..}" />
    </xsl:template>
</xsl:stylesheet>

期望输出:

<newChild chars="&lt;Child attr=&quot;thing&quot;&gt;stuff&lt;/Child&gt;" />

请注意,'chars' 属性的值只是 'Child' 标记的转义版本。

问题:如何将当前匹配的元素放入属性中?我虽然..通常会这样做,但在谈论属性时似乎不会,我只是得到一些随机的 xml 实体,后跟 Child 标记的值,例如<newChild chars="&#xA; stuff&#xA;"/>. 我预计可能需要一些转义的东西才能使其有效。

任何建议表示赞赏。

(在每个人都问我为什么要做这样的事情之前,我受到我要连接的应用程序的 api 的限制)

4

2 回答 2

0

看起来你必须一点一点地建立起来。请注意,..指向父级。您可能想要创建、附加"&lt;Child attr=&quot;"、、、、、连接所有这些并使用创建 chars 属性<value-of select='@attr'/>"&gt;"<value-of select="."/>"&lt;/Child>"<xsl:attribute/>

就像是:

   <newChild >
     <xsl:attribute name="chars">&lt;Child attr=&quot;<xsl:value-of select="@attr"/>"&gt;"<value-of select="."/>&lt;/Child&gt;</xsl:attribute>
   </newChild>

没有检查它,但希望它有帮助。

但是,它非常容易出错。如果我必须这样做,我可能不会使用 XSLT,而是使用具有“toXML()”方法并在其上运行 escapeXML() 的 DOM。

于 2013-05-14T15:12:42.587 回答
0

这里是 JLRishe 提到的解决方案的改编版。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*" mode="asEscapedString">
        <xsl:text> </xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text disable-output-escaping="yes"><![CDATA[=&quot;]]></xsl:text>
        <xsl:value-of select="."/>
        <xsl:text disable-output-escaping="yes"><![CDATA[&quot;]]></xsl:text>
    </xsl:template>

    <xsl:template match="*" mode="asEscapedString">
        <xsl:text>&lt;</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text></xsl:text>
        <xsl:apply-templates select="@*" mode="asEscapedString"/>
        <xsl:text>&gt;</xsl:text>
        <xsl:apply-templates select="node()" mode="asEscapedString"/>
        <xsl:text>&lt;/</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="Child">
        <newChild>
            <xsl:attribute name="chars">
                <xsl:apply-templates mode="asEscapedString" select="." />
            </xsl:attribute>
        </newChild>

    </xsl:template>
    <xsl:template match="*">
        <xsl:apply-templates select="Child"/>
    </xsl:template>
</xsl:stylesheet>

这将生成以下输出:

<newChild chars="&lt;Child attr=&amp;quot;thing&amp;quot;&gt;stuff&lt;/Child&gt;"/>

注意:这与一般的解决方案相去甚远。这适用于您的简单示例。

于 2013-05-14T18:37:55.463 回答