首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理指令中的实体得到更改

处理指令中的实体得到更改
EN

Stack Overflow用户
提问于 2018-10-17 05:32:29
回答 1查看 125关注 0票数 0

我有一个xml文件。

  1. 我正在将处理指令转换为元素。
  2. 属性中处理指令的容量值。
  3. 问题是,在处理指令中有一个实体正在进行修改。
  4. 我要实体保持原样。

我的xslt代码:

代码语言:javascript
复制
        <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>

我得到的输出

代码语言:javascript
复制
    <element>
    <inddq adtxt="adtxt=&#34;hello &amp;#160; Guys&#34;">
    <?comment adtxt="hello &#160; Guys"?>
    </inddq>
    </element>

已经谢了,

EN

回答 1

Stack Overflow用户

发布于 2018-10-17 07:54:42

这是一个棘手的问题,处理指令的内容不被解析为XML,参见https://www.w3.org/TR/REC-xml/#sec-pi语句。

PIs不是文档字符数据的一部分

因此,如果您想将该内容解析为XML,就像您似乎希望XML解析器解释XML字符引用,然后输出为&#160;,那么干净的解决方案将需要XSLT 3

  1. 解析-xml-片段
  2. 字符映射的使用

所以

代码语言:javascript
复制
<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="&#160;" string="&amp;#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>

会转变

代码语言:javascript
复制
<element>
         <?comment adtxt="hello &#160; Guys"?>
        </element>

使用XSLT 3处理器,如Saxon 9.8 (https://xsltfiddle.liberty-development.net/eiZQaG3)或9.9或Altova 2017或2018

代码语言:javascript
复制
<element>
         <inddq adtxt='adtxt=&#34;hello &#160; Guys&#34;'><?comment adtxt="hello &#160; Guys"?></inddq>
        </element>

另一方面,这并不是保存处理指令数据中的任何字符引用,它只是将其解析为XML的一种方法,然后对于输出,用表示该字符的数字字符引用的序列&#160;替换通过字符映射的任何Unicode非断续空格字符。

当然,这种方法可以扩展到其他字符引用,但无论如何,字符映射将应用于任何输出字符,因此不可能仅将其限制在adtxt属性值上。

作为XSLT/XPath 3函数解析-xml片段的替代,您可以使用replace,就像在https://xsltfiddle.liberty-development.net/eiZQaG3/1中所做的那样,但这仍然需要使用字符映射:https://xsltfiddle.liberty-development.net/eiZQaG3/1

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52847842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档