我们哪里出错了?
当我在撒克逊人上使用xslt 2处理此xml时:
<data>
<grab>Grab me and print me back "</grab>
</data>
使用此样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:apply-templates select="/data/grab"/>
</xsl:template>
<xsl:template match="/data/grab">
<node><xsl:value-of select="text()"/></node>
</xsl:template>
</xsl:stylesheet>
我得到此输出:
<?xml version="1.0" encoding="UTF-8"?><node>Grab me and print me back "</node>
但是我想保留“在输出的xml中。因此,我们需要添加一个字符映射表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:character-map name="specialchar">
<xsl:output-character character=""" string="&quot;"/>
</xsl:character-map>
<xsl:output method="xml" indent="no" use-character-maps="specialchar"/>
<xsl:template match="/">
<xsl:apply-templates select="/data/grab"/>
</xsl:template>
<xsl:template match="/data/grab">
<node><xsl:value-of select="text()"/></node>
</xsl:template>
</xsl:stylesheet>
其中保留了“实体...,恕我直言,看起来冗长而丑陋,
这真的有必要吗?有没有更优雅的选择?如果没有,这背后的原理是什么?
在架构上,XSLT将XDM树转换为XDM树,而不是将词法XML转换为词法XML。 XDM树不区分"
和"
,仅比区分<a id="5"/>
和<a id = '5'></a>
。 XSLT程序员隐藏了编写XML的方式上任意和无关紧要的事实,这在很大程度上是设计使然的,这使得编写正确的转换变得容易得多。
[现在肯定有保存实体引用的用例:尤其是像&author;
这样的语义实体引用,它们在不同情况下可能具有不同的值。但是实体引用并不是解决该要求的特别好的方法; XInclude通常更好。而且该参数不适用于"
这样的字符引用:很难看到一个很好的用例来区别对待"
和"
,并且您肯定没有提供过这种用例。
实际上,撒克逊人即使愿意也无法保留"
,因为它不知道它在那儿:XML解析器(将词法XML转换为XDM)不会将字符引用通知给应用。同样,这是设计使然:理论是应用程序不应该也不应该在乎。它具有很大的优点,那就是我们不会从无法解决这种可能性的应用程序开发人员那里收到无数的SO问题。