繁体   English   中英

XSLT 变换 XML | 如何删除特殊字符

[英]XSLT transform XML | How to Remove special characters

输入 XML:

<Products>
    <Product id="ADEDEWADE0009" name="Akumulator DeWalt XR DCB184-XJ (Li-Ion)" producer="DEW" categoryId="ADE-ADE" warranty="F012M" priceNet="234.00" vat="23" vat_type="zwykły" pkwiu="27.20.23.0" externalWarehouse="N" available="30" date="2018-06-08" onOrder="N" specialOffer="N" smallPallet="N" productIsLarge="N" reported="T" EAN="5035048466933" manufacturerPartNumber="DCB184-XJ" sizeWidth="90" sizeLength="75" sizeHeight="130" weight="672" sizeMeasurementUnit="mm" weightMeasurementUnit="g" dimensionalWeight="175" additionalAvailabilityInfo="" expiryDate="1900-01-01" ETA="" incomingStock="0" mainCategoryTree="Dom, Warsztat i Ogród" categoryTree="Narzędzia - osprzęt" subCategoryTree="Akumulatory">
        <Images>
            <Image url="/Icecat/O2N59732L0C0C1V6o7K4N143m7O7K7A8.jpg" isMain="0" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/I4B7m9t9K000X1b6w7V471A3H7R737c8.jpg" isMain="0" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/O9P0t7g7k0k0E1s6H7O4u1R3H7c757V9.jpg" isMain="1" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/I1P2w3a2c0r0N116X7E4P1a3n7l7w7q9.jpg" isMain="0" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/T9X096A3D0D0T1d6A7h481i3B7P7A8L0.jpg" isMain="0" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/Q1D233T3K020Z10607c421L3N7Z7Q8n1.jpg" isMain="0" date="2023-01-19" copyright="0" />
            <Image url="/Icecat/Z2X2z2e5s03031B6G7r4j1Z2W4C9B926.jpg" isMain="0" date="2023-01-19" copyright="0" />
        </Images>
        <Multimedia />
        <TechnicalSpecification>
            <Section name="Cechy">
                <Attributes>
                    <Attribute name="Kolor produktu">
                        <Values>
                            <Value Name="Czarny" />
                            <Value Name="Żółty" />
                        </Values>
                    </Attribute>
                    <Attribute name="Wymiary otworu (dł.*szer.*wys.)"
                        <Values>
                            <Value Name="DeWALT" />
                        </Values>
                    </Attribute>
                    <Attribute name="Napięcie baterii">
                        <Values>
                            <Value Name="18 V" />
                        </Values>
                    </Attribute>
                    <Attribute name="Rodzaj baterii">
                        <Values>
                            <Value Name="Litowo-jonowa (Li-Ion)" />
                        </Values>
                    </Attribute>
                </Attributes>
            </Section>
        </TechnicalSpecification>
    </Product>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
  
  <xsl:output method="text"/>
  
  <xsl:variable name="first-step-result">
    <xsl:apply-templates/>
  </xsl:variable>
  
  <xsl:variable name="dynamic-elements" select="$first-step-result//*[starts-with(local-name(), 'Image_extra')]"/>
  <xsl:variable name="cdata-section-elements" select="$dynamic-elements/node-name()"/>
  
  <xsl:template match="/">
    <xsl:value-of select="serialize($first-step-result, map { 'method' : 'xml', 'indent': true(), 'cdata-section-elements' : $cdata-section-elements })"/>
  </xsl:template>


    <xsl:template match="Products">
      <xsl:copy>
        <xsl:apply-templates select="Product"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Product">
      <xsl:copy>
        <xsl:for-each select="@*">
          <xsl:element name="{name()}">
              <xsl:value-of select="."/>
          </xsl:element>
        </xsl:for-each>
        <xsl:apply-templates select="Images/Image"/>
        <xsl:apply-templates select="TechnicalSpecification/Section/Attributes/Attribute"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Image[@isMain='1']">
      <Image_main>
        <xsl:value-of select="@url"/>
      </Image_main>
    </xsl:template>
    
    <xsl:template match="Image[@isMain='0']">
      <xsl:element name="{concat('Image_extra_',position())}">
        <xsl:value-of select="@url"/>
      </xsl:element>
    </xsl:template>
    
    <xsl:template match="Attribute">
      <xsl:element name="{translate(@name,' ()', '___')}">
        <xsl:value-of select="Values/Value/@Name"/>
      </xsl:element>
    </xsl:template>
  
</xsl:stylesheet>

上面的代码运行良好,但我的结构 XML 有问题。

问题与这部分 XML 代码有关:

<Attributes>
                        <Attribute name="Kolor produktu">
                            <Values>
                                <Value Name="Czarny" />
                                <Value Name="Żółty" />
                            </Values>
                        </Attribute>
                        <Attribute name="Kompatybilność z marką">
                            <Values>
                                <Value Name="DeWALT" />
                            </Values>
                        </Attribute>
                        <Attribute name="Napięcie baterii">
                            <Values>
                                <Value Name="18 V" />
                            </Values>
                        </Attribute>
                        <Attribute name="Rodzaj baterii">
                            <Values>
                                <Value Name="Litowo-jonowa (Li-Ion)" />
                            </Values>
                        </Attribute>
                    </Attributes>

我尝试将此代码转换为:

 <Kompatybilność_z_marką>DeWALT</Kompatybilność_z_marką>

但目前我无法转换,因为此属性包含大多数特殊字符,如: <Attribute name="Rodzaj baterii&ć#">

并且程序返回带有无效标签名称的错误。

  1. 如何删除所有特殊字符和波兰语字符以始终获得正确的 output,例如:

    <rodzaj_baterii>

这个例子

<Attribute name="Rodzaj baterii&ć#">

包含一个未转义的符号。 这意味着它的格式不正确 XML,这意味着您无法使用 XSLT 处理它。

您需要找出这个损坏的 XML 的来源并修复创建它的进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM