【问题标题】:How to replace characters in xml document using xsl如何使用 xsl 替换 xml 文档中的字符
【发布时间】:2015-10-05 10:46:36
【问题描述】:

我有一个xml文档(这个xml格式不正确)如下

<ads>
   <adv>
       <a>BURGER & BROWN ENGINEERING</a>
       <b>123*3491</b>
   <adv>
   <adv>
       <x>Roster Service</x>
       <y>BROWN & BURGER ENGINEERING</y>
       <z>905*3490</z>
   <adv>
<ads>

我想要一个 XSLT 来将 XML 转换成这个。

i) 和号(&) 应替换为 " 和 "

ii) * 应替换为 " "

<ads>
   <adv>
       <a>BURGER and BROWN ENGINEERING</a>
       <b>123 3491</b>
   <adv>
   <adv>
       <x>Roster Service</x>
       <y>BROWN and BURGER ENGINEERING</y>
       <z>905 3490</z>
   <adv>
<ads>

我有一个如下的xsl,但这不能满足我的要求。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

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

<xsl:template match="text()">
  <xsl:value-of select="translate(., '&', ' and ')" />
  <xsl:value-of select="translate(., '*', ' ')" />
</xsl:template>

【问题讨论】:

  • 您显示的是您的输入不是 XML 文档;您不能在 XML 中使用未转义的 & 符号。
  • @michael.hor257k - 我正在通过以下一些过程获取 xml 文档。纠正它是我的责任。这肯定是错误的xml。我该怎么做
  • 如果您的输入确实是这样,那么在 XSLT 中您几乎无法使用它。
  • 当有人说“这个 xml 格式不正确”时,这与说“这不是 XML”是一样的。如果不是 XML,那么 XSLT 就无法处理。

标签: xml xslt


【解决方案1】:

给定一个格式良好的 XML 输入,例如:

XML

<ads>
   <adv>
       <a>BURGER &amp; BROWN ENGINEERING</a>
       <b>123*3491</b>
   </adv>
   <adv>
       <x>Roster Service</x>
       <y>BROWN &amp; BURGER ENGINEERING</y>
       <z>905*3490</z>
   </adv>
</ads>

您可以使用以下样式表:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

<xsl:template match="text()">
  <xsl:value-of select="replace(translate(., '*', ' '), '&amp;', 'and')" />
</xsl:template>

</xsl:stylesheet>

返回:

<?xml version="1.0" encoding="UTF-8"?>
<ads>
   <adv>
       <a>BURGER and BROWN ENGINEERING</a>
       <b>123 3491</b>
   </adv>
   <adv>
       <x>Roster Service</x>
       <y>BROWN and BURGER ENGINEERING</y>
       <z>905 3490</z>
   </adv>
</ads>

【讨论】:

  • 我使用 perl -pi -e 's/&/&/' $file 命令将 & 替换为 &然后按照上述说明进行。谢谢
【解决方案2】:

您的输入不是 XML,因此任何设计用于处理 XML 的工具都无法读取它。

对于不良 XML 的最佳解决方案始终是修复生成它的软件。但如果软件是由一些不关心质量、支持或用户的牛仔服装编写的,那么这可能是不可能的。

如果您需要修复坏的 XML,那么您将需要非 XML 工具来完成,通常是 Perl/awk/sed 的某种组合。当然,这并不总是可能的,因为如果软件生成的 XML 格式错误,它也可能生成格式正确但包含错误信息的 XML。

无法逃脱 & 符号是一个很常见的问题,这取决于您需要多好的修复程序。有时,您可以通过用&amp;amp; 替换任何不带字母、“#”或数字的&amp; 来解决99% 的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多