首页 > 解决方案 > XSLT 转换后的非法字符问题

问题描述

以下是我们的 XML 文件的输出日期:

XML

<attributes>
<![CDATA[Wodoodporność: 3 ATM - Średnica: 62 mm - Rodzaj: Męskie - Materiał: Stal nierdzewna - Materiał paska: Skóra - Mechanizm: Kwarcowy - Funkcje: Wielofunkcyjność - Szkiełko: Mineralne - Rodzaj produktu: Zegarek na rękę - Opakowanie: Oficjalne pudełko]]></attributes>

转换: XSLT 1.0

<xsl:stylesheet version="1.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="/">
    <output>
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="normalize-space(attributes)"/>
        </xsl:call-template>
    </output>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' - '"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <xsl:element name="{translate(substring-before($token, ': '), ' ', '_')}">
                <xsl:value-of select="substring-after($token, ': ')" />
            </xsl:element>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

目前我得到结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <Wodoodporność>3 ATM</Wodoodporność>
  <Średnica>62 mm</Średnica>
  <Rodzaj>Męskie</Rodzaj>
  <Materiał>Stal nierdzewna</Materiał>
  <Materiał_paska>Skóra</Materiał_paska>
  <Mechanizm>Kwarcowy</Mechanizm>
  <Funkcje>Wielofunkcyjność</Funkcje>
  <Szkiełko>Mineralne</Szkiełko>
  <Rodzaj_produktu>Zegarek na rękę</Rodzaj_produktu>
  <Opakowanie>Oficjalne pudełko</Opakowanie>
</output>

有些文字不正确。有没有人有任何解决方案。

示例添加:<Średnica>[CDATA[ 62 mm ]</Średnica>

或任何其他解决方案来解决这个问题?

标签: xmlxslt

解决方案


推荐阅读