如何使用xsl替换xml文档中的字符

时间:2015-10-05 10:46:36

标签: xml xslt

我有一个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)&符号(&amp;)应替换为“and”

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>

2 个答案:

答案 0 :(得分:2)

给出格式良好的 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>

答案 1 :(得分:2)

您的输入不是XML,因此没有专门用于处理XML的工具能够读取它。

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

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

未能逃脱&符号是一个非常常见的问题,这取决于您需要多好的修复。有时,您可以通过替换任何后面没有字母,#39;#&#39;或&数字的&amp;来解决99%的问题。