XSLT生成后崩溃了。所有属性都是不可见的

时间:2019-02-15 13:58:01

标签: xml xslt xslt-2.0

我已经替换了以下字符,即ÁÁÀÄÖÓÔÒØÅÜÉŠŽááàäöôòøååüéšβźý,而且一切正常。但是,在xslt之后,结果将缺少所有属性名称。

曾经看过stackoverflow并发现了一些很棒的代码,但是由于某种原因,我无法使其正常工作。

我当前的代码: `     

<xsl:template match="@*|node()">
    <xsl:call-template name="ReplaceChars">
        <xsl:with-param name="Input" select="."/>
    </xsl:call-template>
</xsl:template>

<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>

<xsl:template name="ReplaceChars">
    <xsl:param name="Input"/>
    <xsl:value-of select="translate(replace(replace($Input, 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>

`

工作示例:http://xsltfiddle.liberty-development.net/ej9EGbZ

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的XML中没有属性。缺少的是您的要素。那是因为您没有复制它们。改为尝试这种方式:

<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:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>

<xsl:template match="text()">
    <xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>

</xsl:stylesheet>

请注意,您的问题和样式表都标记为version=1.0"-但是您使用的是replace()函数,该函数仅在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:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>

<xsl:template match="text()">
    <xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>      
    </xsl:attribute>
</xsl:template>

<xsl:template match="comment() | processing-instruction()">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

由于您使用的是XSLT 2.0,因此也可以使用xsl:character-map

看起来很多,但是您可以将字符映射表分解成单独的样式表,然后xsl:include

示例...

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" use-character-maps="cm"/>
  <xsl:strip-space elements="*"/>

  <xsl:character-map name="cm">
    <xsl:output-character character="Á" string="A"/>
    <xsl:output-character character="Â" string="A"/>
    <xsl:output-character character="À" string="A"/>
    <xsl:output-character character="Ä" string="A"/>
    <xsl:output-character character="Ö" string="O"/>
    <xsl:output-character character="Ó" string="O"/>
    <xsl:output-character character="Ô" string="O"/>
    <xsl:output-character character="Ò" string="O"/>
    <xsl:output-character character="Ø" string="O"/>
    <xsl:output-character character="Å" string="A"/>
    <xsl:output-character character="Ü" string="U"/>
    <xsl:output-character character="É" string="E"/>
    <xsl:output-character character="Š" string="S"/>
    <xsl:output-character character="Ž" string="Z"/>
    <xsl:output-character character="á" string="a"/>
    <xsl:output-character character="â" string="a"/>
    <xsl:output-character character="à" string="a"/>
    <xsl:output-character character="ä" string="a"/>
    <xsl:output-character character="ö" string="o"/>
    <xsl:output-character character="ô" string="o"/>
    <xsl:output-character character="ò" string="o"/>
    <xsl:output-character character="ø" string="o"/>
    <xsl:output-character character="å" string="a"/>
    <xsl:output-character character="ü" string="u"/>
    <xsl:output-character character="é" string="e"/>
    <xsl:output-character character="š" string="s"/>
    <xsl:output-character character="β" string="s"/>
    <xsl:output-character character="ź" string="z"/>
    <xsl:output-character character="ý" string="y"/>
    <xsl:output-character character="ß" string="ss"/>
    <xsl:output-character character="ẞ" string="SS"/>    
  </xsl:character-map>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

提琴:http://xsltfiddle.liberty-development.net/ej9EGbZ/3