【问题标题】:Replace '&' with '&' in xml using xsl使用 xsl 在 xml 中将 '&' 替换为 '&'
【发布时间】:2012-11-14 18:16:32
【问题描述】:

我正在为一个 xml 编写一个 xsl,但我在我的 xml 中被困在&。 它显示类似A semi colon character was expected. Error processing resource.. 的错误。

现在我希望将所有 & 替换为 &。这样它就不会显示任何错误。

我怎样才能做到这一点?

有没有其他方法可以解决这个问题?

【问题讨论】:

  • 我认为使用 CDATA 可以防止这种情况发生。
  • 我想 XSLT 不可能,因为 XML 格式不正确(请参阅您遇到的错误)。 XSLT 需要格式良好的 XML。您应该使用文本编辑器的搜索和替换功能,或者使用 sed/awk。
  • 好吧,严格来说这不是真的,您应该能够将文件解析为文本。但是,您最好使用 sed/awk 或其他一些正则表达式解决方案(perl?)作为预处理步骤。
  • 另外,如果您这样做,请注意替换有效的 &与 &
  • 这些 XML 文件最初是如何创建的..

标签: xml xslt


【解决方案1】:

不能使用 XSL - 它只对格式正确的 XML 输入进行操作。

您需要使用一些搜索和替换功能,例如 sed:

sed -i 's:&:&:' yourfile.xml 

甚至更好:

sed -i 's:&:&:g;s:amp;amp;:amp;:g;' yourfile.xml

这会阻止您替换正确的实体引用。

【讨论】:

  • 绝对可以使用 XSL(请参阅我的回答) - 但您必须将输入视为未解析的文本。
  • 不错的技巧 :) 但需要额外的(格式良好的)文件作为处理输入;为什么不呢,也许它更适合给定的用例
  • @Michael Kay:您的意思是“现在可以通过调用命名模板来调用转换”在 xslt20 规范中吗?我找不到更近的东西……你能发一个具体的链接吗?谢谢
【解决方案2】:

所以这里有一个答案。将 $input 参数替换为您的输入文件。针对任何有效的 XML 文件运行 - 而不是您的输入文件作为输入 - 脚本将忽略它。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
  exclude-result-prefixes="xs xd"
  version="2.0">

  <xsl:param name="input" select="'file:/U:/input.txt'"/>

  <xsl:template match="/">
    <result>
    <xsl:analyze-string select="unparsed-text($input)" regex="&amp;">
      <xsl:matching-substring><xsl:text>&amp;</xsl:text></xsl:matching-substring>
      <xsl:non-matching-substring><xsl:copy-of select="."></xsl:copy-of></xsl:non-matching-substring>
    </xsl:analyze-string>
    </result>
  </xsl:template>

</xsl:stylesheet>

PS - 我将此作为概念证明,而不是针对您的潜在问题的建议解决方案。 XSLT 不是这项工作的最佳工具(仅仅因为你只有一把锤子并不意味着你应该把所有东西都当作钉子对待)。

【讨论】:

  • 您需要使用该正则表达式做更多事情以避免“纠正”已经有效的实体。如果您还遇到与 " ’等等 - 纠正 将是一场噩梦!
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 2019-03-22
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多