XSLT ломается после поколения.Все атрибуты невидимы - PullRequest
0 голосов
/ 15 февраля 2019

Я заменил следующие символы: ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý, и это работает просто отлично.Тем не менее, после 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 голосов
/ 15 февраля 2019

Поскольку вы используете XSLT 2.0, вы также можете использовать xsl:character-map.

Это выглядит много, но вы можете разбить карту персонажей на отдельную таблицу стилейи xsl:include it.

Пример ...

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

0 голосов
/ 15 февраля 2019

В вашем 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="*"/>

<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>
...