我有一个xml文件。
我的xslt代码:
<xsl:template match="element">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction(comment)">
<inddq>
<xsl:attribute name="adtxt">
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:processing-instruction name="comment">
<xsl:value-of select="."/>
</xsl:processing-instruction>
</inddq>
</xsl:template>我得到的输出
<element>
<inddq adtxt="adtxt="hello &#160; Guys"">
<?comment adtxt="hello   Guys"?>
</inddq>
</element>已经谢了,
发布于 2018-10-17 07:54:42
这是一个棘手的问题,处理指令的内容不被解析为XML,参见https://www.w3.org/TR/REC-xml/#sec-pi语句。
PIs不是文档字符数据的一部分
因此,如果您想将该内容解析为XML,就像您似乎希望XML解析器解释XML字符引用,然后输出为 ,那么干净的解决方案将需要XSLT 3
所以
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output use-character-maps="m1"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:character-map name="m1">
<xsl:output-character character=" " string="&#160;"/>
</xsl:character-map>
<xsl:template match="processing-instruction(comment)">
<inddq>
<xsl:attribute name="adtxt">
<xsl:value-of select="parse-xml-fragment(.)"/>
</xsl:attribute>
<xsl:processing-instruction name="comment">
<xsl:value-of select="."/>
</xsl:processing-instruction>
</inddq>
</xsl:template>
</xsl:stylesheet>会转变
<element>
<?comment adtxt="hello   Guys"?>
</element>使用XSLT 3处理器,如Saxon 9.8 (https://xsltfiddle.liberty-development.net/eiZQaG3)或9.9或Altova 2017或2018
<element>
<inddq adtxt='adtxt="hello   Guys"'><?comment adtxt="hello   Guys"?></inddq>
</element>另一方面,这并不是保存处理指令数据中的任何字符引用,它只是将其解析为XML的一种方法,然后对于输出,用表示该字符的数字字符引用的序列 替换通过字符映射的任何Unicode非断续空格字符。
当然,这种方法可以扩展到其他字符引用,但无论如何,字符映射将应用于任何输出字符,因此不可能仅将其限制在adtxt属性值上。
作为XSLT/XPath 3函数解析-xml片段的替代,您可以使用replace,就像在https://xsltfiddle.liberty-development.net/eiZQaG3/1中所做的那样,但这仍然需要使用字符映射:https://xsltfiddle.liberty-development.net/eiZQaG3/1。
https://stackoverflow.com/questions/52847842
复制相似问题