Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Don';t转换>;至&;燃气轮机;在XSLT中_Xslt - Fatal编程技术网

Don';t转换>;至&;燃气轮机;在XSLT中

Don';t转换>;至&;燃气轮机;在XSLT中,xslt,Xslt,我有一些XML看起来像 <?xml version="1.0"?> <root> <![CDATA[ > foo ]]> </root> 但我想要的结果是 <?xml version="1.0"?> <foo> > foo </foo> >福 i、 e.保持“>”不变,而不是将其转换为实体。我怎样才能做到这一点呢?但它不是格式良好的XML 使用更新,它将是

我有一些XML看起来像

<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo 
    ]]>
</root>
但我想要的结果是

<?xml version="1.0"?>
<foo>

    > foo

</foo>

>福
i、 e.保持“>”不变,而不是将其转换为实体。我怎样才能做到这一点呢?

但它不是格式良好的XML

使用
更新
,它将是格式良好的。(带有
@Oded、@khachik、

试试看,它确实是格式良好的XML。(“Valid”在这里甚至不是问题,因为没有模式。)

常见的误解是“>”在格式良好的XML中不合法。 在大多数情况下,“”在任何地方都是合法的,只有一个罕见的例外。规范的主要内容:

符号和字符(&)和 左尖括号()可以使用 字符串“”和必须,用于 兼容性,可以使用 “”或字符引用时 它出现在中的字符串“]]>”中 内容,当该字符串不可用时 标记CDATA区域的结束

在XSLT2.0中,实现所需的“正确”方法是使用
。 对于XSLT 1.0,我认为强制在输出中使用“>”的唯一方法是使用禁用输出转义,正如@khachik所建议的那样。但是请注意,XSLT处理器是,有些不能(例如,如果它们在管道中并且没有连接到序列化).但是您现在可能知道您的是否可以,如果不能,您将需要在管道的末尾处理序列化问题

然而,值得一问,为什么要将“>”序列化为“>”?从规范中可以看出,对于XML而言,这是一种完全可以接受的表达完全相同信息的方式。任何下游XML消费者都不应该知道其中的区别或在意。出于美观的原因,您想要它吗


更新:OP希望这样,因为输出不仅需要格式良好的XML,还需要格式良好的识字Haskell。

补充了对@LarsH的非常好的解释:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/root">
        <foo><xsl:value-of select='.' disable-output-escaping="yes"/></foo>
    </xsl:template>
  </xsl:stylesheet>
<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo
    ]]>
</root>
<foo>
    > foo
    </foo>
如果XSLT处理器允许,则可以使用

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/root">
        <foo><xsl:value-of select='.' disable-output-escaping="yes"/></foo>
    </xsl:template>
  </xsl:stylesheet>
<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo
    ]]>
</root>
<foo>
    > foo
    </foo>

当此转换应用于提供的XML文档时

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/root">
        <foo><xsl:value-of select='.' disable-output-escaping="yes"/></foo>
    </xsl:template>
  </xsl:stylesheet>
<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo
    ]]>
</root>
<foo>
    > foo
    </foo>

福
]]>
产生所需的输出

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/root">
        <foo><xsl:value-of select='.' disable-output-escaping="yes"/></foo>
    </xsl:template>
  </xsl:stylesheet>
<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo
    ]]>
</root>
<foo>
    > foo
    </foo>

>福

>
一起,它将作为XML无效。@khachik,不是真的;请看我的答案。@khachik W3C XML验证程序同意LarsH的观点,所需的输出是有效的XML。@pafcu从未想过它会是haskell代码。
是有效的,但
@pafcu,我很好奇,你是如何获得W3C XML有效性的tor检查XML格式是否正确?我只能让它验证HTML/XHTML。可能我的URL错误?输出应该是可读的Haskell,它要求包含可执行程序代码的行以文本字符“>”开头而其他一切都被视为注释。识字的Haskell解析器对XML一无所知,也不知道and>在XML中是等价的。@LarsH您的答案中有什么价值?@khachik:没有,我用XML以简洁的形式记录代码,然后通过XSLT将其转换为XHTML。@LarsH:当使用
method=“text”时
元素似乎被剥离了,也就是说,我在输出中没有看到
。我确实关心输出中的XML,因为它应该是XHTML,也就是XML。输出是有效的XHTML和有效的Haskell,这是识字Haskell的全部要点。我是OP,我同意LarsH post的帮助:-)我承认我对您的答案投了反对票,因为“>”的错误部分不是格式良好的XML。我希望我能取消否决票,或者增加一个赞成票,因为有人建议使用d-o-e。但是它不会让我,除非你编辑你的答案。如果你这样做了,让我知道,这样我就可以改变我的投票。@LarsH我更新了我的答案,使之正确。您不需要向上投票,因为它被正确地投了反对票,
不会使XML格式不正确(在这种情况下,“无效”这个词是不正确的)。谢谢:)