【问题标题】:XSLT / XML: convert apostrophe to a specific entity stringXSLT / XML:将撇号转换为特定实体字符串
【发布时间】:2012-12-06 23:35:08
【问题描述】:

我希望能够使用 XSLT 将撇号转换为字符串 '。我有以下 XML

<OrgName>King's College</OrgName>

我希望能够输出以下内容:

<OrgName>King&apos;s College</OrgName>

我尝试了字符映射,但我认为这不起作用,因为您只能用字符串替换单个字符。

我也尝试了替换功能,但我不确定我可以做些什么来确保完整的字符串实际出现在输出文件中?

<xsl:value-of select='replace(OrgName,"&amp;apos;","&amp;apos;")' />

在我的最终解决方案中,我需要能够替换文本中的所有撇号,而不仅仅是一个节点。

【问题讨论】:

  • ">我尝试了字符映射,但我认为这不起作用,因为您只能用字符串替换单个字符。"但是用字符串替换字符正是您想要做的。人物贴图可以做这个,看来你做错了。
  • 好问题,+1。有关使用字符映射的完整、简短且简单的解决方案,请参阅我的答案。 :)
  • 感谢您的回答,我会检查是否可以让他们工作。我认为字符映射不起作用的原因是我认为撇号将由预定义的实体 ' 表示。即使它在文件中看起来不像那样。对我来说“’”看起来像一个字符串而不是单个字符,所以我认为这是不可能的。也许我不了解实体是如何工作的?我也很困惑为什么我能够在原始 XML 文档中使用文字 ' 而不是实体字符串。
  • 请注意,从真正的 XML 使用者的角度来看,这两个 XML 文档是相同的。
  • @Michael Kay - 你是对的,我做错了什么。字符映射正在工作并输出“'”问题是我当时正在重新解析输出并构建一个正在撤消我的工作的 JDOM 文档。现在我只是将输出流从转换中直接写入文件,它工作正常。

标签: xml xslt character-encoding escaping


【解决方案1】:

使用character map 就这么简单

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes" use-character-maps="mApos"/>

    <xsl:character-map name="mApos">
     <xsl:output-character character="&apos;" string="&amp;apos;"/>
    </xsl:character-map>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:copy-of select="." />
 </xsl:template>
</xsl:stylesheet>

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

<OrgName>King's College</OrgName>

产生了想要的正确结果:

<OrgName>King&apos;s College</OrgName>

【讨论】:

  • @MarcoS:是的,字符映射是 XSLT 2.0 中不错的新特性之一。
  • 我们有同样的方法可用于 xslt1.0 吗?
  • @softwaredev,不,字符映射最早是在 XSLT 2.0 中引入的
【解决方案2】:

这只是部分答案:

要替换字符',您可以使用以下内容:

<xsl:value-of select="replace(xs:string(str), 
                              codepoints-to-string(39), 
                              '&amp;apos;')"/>

这需要 XSLT/XPath 2.0。说明codepoints-to-string从码位序列中返回一个字符串,39对应字符''

为了在你的 XML 的每个节点上做这个替换......我目前没有解决方案:会考虑一下。

无论如何,我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 2016-01-05
    • 2019-05-05
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2013-01-10
    相关资源
    最近更新 更多