如何通过XSLT转换包含特殊字符的XML?

时间:2018-11-12 15:25:58

标签: c# xml visual-studio xslt

这是我的XML示例:

<Products>
<Product Code="801027343416" Gtin="3432123" Title="N-D something" 
SubTitle="N-D something" Category="PETSHOP > Dog" Brand="N&D" Cost="464.45" 
Price="538.00" Stock="2" Vat="18">
<Definition>
<div><span style=\"font-weight: bold;\">N&amp;D NATURAL DELICIOUS CHICKEN 
&amp; POMEGRANATE LARGE PUPPY</span></div> <div><span style=\"font-weight: 
bold;\">somethingsomethingsomethingsomethingsomethingsomething
KG.</span></div> <div><br /> </div> <div>x</div> <div>Natural &amp; 
Delicious etoburların     
xx xxx</div> <div>6. Txxenter code here....</div>
</Definition>

<Image Image1="http://www.asd.com/img/products/8010276020116_td_2.jpg" 
Image2="http://www.asd.com/img/products/8010276020116_td_2.jpg" 
Image3="http://www.asd.com/img/products/8010276020116_td_2_2.jpg"/>
</Product>
 .....

还有我的xslt:

 <?xml version="1.0"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0">
  <xsl:output method="xml" indent="yes"/>
  xsl:template match="/" >
   <xml>
    <xsl:for-each select="Products/Product">
    <xsl:choose>
      <xsl:when test="Product/@Code!= ''">
        <xsl:variable name="Acost" select="Product/@Cost"> 
        </xsl:variable>
        <xsl:variable name="Cost" select="format-  
           number((($Acost)*1.06),'#.####')"></xsl:variable>
        <xsl:variable name="Price" select="format-number((($Cost) 
         * 1.15),'#.####')"></xsl:variable>
        <xsl:variable name="vat" select="Product/@Vat"></xsl:variable>
        <xsl:variable name="Barcode" select="Product/@Code"></xsl:variable>
        <xsl:variable name="Name" select="Product/@Title"></xsl:variable>
        <xsl:variable name="Ctgry" select="Product/@Category"> 
        </xsl:variable>
        <xsl:variable name="Brnd" select="Product/@Brand"></xsl:variable>       
        <xsl:variable name="Dscrptn" select="Description"> 
        </xsl:variable>

          <Product>
         <BrandName>
            <xsl:variable name="amp" select="'&amp;'"></xsl:variable>
            <xsl:choose>
            <xsl:when test="contains($Brnd,$amp)">
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
            <xsl:value-of select="translate($Brnd,$amp,'&amp;&amp;')"/>
            <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$Brnd"/>
            </xsl:otherwise>
            </xsl:choose>              
          </BrandName>
          <Description>
           <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
           <xsl:value-of select="translate($Dscrptn,'\','')"/>
          <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
          </Description>

我无法通过Xslt 1.0解析XML。首先,'Brand =“ N&D”'阻止了它,因此我尝试对其进行修复并翻译,但没有任何效果。然后,描述样式中的反斜杠\阻止了转换事件。我找不到处理方法。

我知道在XSLT转换之前,我必须将“&”转换为“&amp”,如上所示,但是我不能对其使用转换功能。 Xslt总是卡住,不接受我选择的情况来处理它。作为结论,我是否应该要求从XML资源更改为新资源?

0 个答案:

没有答案