2015-10-05 47 views
0

我有一个XML文件来替换XML文档中的字符(这个XML的格式不正确)如下如何使用XSL

<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> 

+2

显示的内容是因为您的输入不是XML文档; XML中不能有非转义的&符号。 –

+0

@ michael.hor257k - 我通过以下一些流程获取xml文档。我有责任纠正它。这肯定是错误的XML。我该怎么做 – Sam

+0

如果这确实是你输入的样子,那么在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> 
+0

我用perl -pi -e的/ &/& /'$ file命令替换为&然后按照上面的说明进行操作。谢谢 – Sam

2

您的输入不是XML,所以没有工具,用于处理XML就可以读取它。

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

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

无法逃避&符号是一个很常见的问题,它取决于您需要的修复程序有多好。有时,您可以通过替换&来代替99%的问题,这些&之后没有字母,'#'或数字&amp;