如何保持AND逃脱无与伦比的元素?

时间:2011-08-02 22:56:28

标签: php xml xslt escaping

考虑这个XML代码:

<root>
blah <foo>blah</foo> blah <bar>blah</bar> blah
</root>

他的相关样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="foo">
        <strong><xsl:apply-templates/></strong>
    </xsl:template>

</xsl:stylesheet>

使用XSLTProcessor类(PHP)进行转换后,输出结果如下:

blah <strong>blah</strong> blah blah blah

但我更喜欢这个输出(样式表中的未知元素被转义):

blah <strong>blah</strong> blah &lt;bar&gt;blah&lt;/bar&gt; blah

我的伪代码提案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="foo">
        <strong><xsl:apply-templates/></strong>
    </xsl:template>

    <xsl:template match="all elements other than foo (with their attributs :p)">
        <xsl:copy-of select="node()" escape="yes"/>
    </xsl:template>

</xsl:stylesheet>

我很绝望,所以如果你有任何保存和逃避这些无用元素的解决方案,我会非常高兴!

2 个答案:

答案 0 :(得分:1)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="root">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="foo">
        <strong><xsl:value-of select="."/></strong>
    </xsl:template>

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

        <xsl:apply-templates select="node()"/>

        <xsl:text>&lt;/</xsl:text>
            <xsl:value-of select="local-name(.)"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:text>&#160;</xsl:text>
        <xsl:value-of select="name()" />
        <xsl:text>="</xsl:text>
        <xsl:value-of select="." />
        <xsl:text>"</xsl:text>
    </xsl:template>

    <xsl:template match="comment()">
         <xsl:text>&lt;!--</xsl:text>
         <xsl:value-of select="."/>
          <xsl:text>--&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="processing-instruction()">
         <xsl:text>&lt;? </xsl:text>
         <xsl:value-of select="name()"/>
         <xsl:text>&#160;</xsl:text>
         <xsl:value-of select="."/>
          <xsl:text>?&gt;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

写下我的头脑,所以请不要引用我:D

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="root">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="foo">
        <strong><xsl:value-of select="."/></strong>
    </xsl:template>

    <xsl:template match="node()">
        &lt;<xsl:value-of select="local-name(.)"/>&gt;<xsl:value-of select="."/>&lt;/<xsl:value-of select="local-name(.)"/>&gt;
    </xsl:template>

</xsl:stylesheet>