[英]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&ć#">
并且程序返回带有无效标签名称的错误。
如何删除所有特殊字符和波兰语字符以始终获得正确的 output,例如:
<rodzaj_baterii>
这个例子
<Attribute name="Rodzaj baterii&ć#">
包含一个未转义的符号。 这意味着它的格式不正确 XML,这意味着您无法使用 XSLT 处理它。
您需要找出这个损坏的 XML 的来源并修复创建它的进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.