Ошибка преобразования xslt: XTSE0010: элемент xsl: mode не должен отображаться непосредственно в xsl: таблице стилей - PullRequest
0 голосов
/ 19 июня 2020

Я хочу изменить узлы с одного значения на другое. Не значение узла, а имя узла. Не содержимое внутри тегов.

Википедия называет «теги» как:

Тег Тег - это конструкция разметки, которая начинается с <и заканчивается>. Теги бывают трех видов:

    start-tag, such as <section>;
    end-tag, such as </section>;
    empty-element tag, such as <line-break />.

Итак, я хочу переименовать все вышеперечисленные теги одного имени в другое. Поскольку foo до bar или bar до baz, et c.

работает saxonb-xslt возвращает:

Saxon 9.1.0.8J from Saxonica

Возможно, эта версия Saxon не имеет возможностей или, что более вероятно, xslt ошибочен.

усечено xml из большего файла:

<csv>
  <foo>
    <entry>Reported_Date</entry>
    <entry>HA</entry>
    <entry>Sex</entry>
    <entry>Age_Group</entry>
    <entry>Classification_Reported</entry>
  </foo>
  <bar>
    <entry>2020-01-26</entry>
    <entry>Vancouver Coastal</entry>
    <entry>M</entry>
    <entry>40-49</entry>
    <entry>Lab-diagnosed</entry>
  </bar>
  <record>
    <baz>2020-02-02</baz>
    <entry>Vancouver Coastal</entry>
    <entry>baz</entry>
    <entry>50-59</entry>
    <entry>Lab-diagnosed</entry>
  </record>
  <record>
    <entry>2020-02-05</entry>
    <entry>Vancouver Coastal</entry>
    <entry>F</entry>
    <entry>20-29</entry>
    <entry>Lab-diagnosed</entry>
  </record>
</csv>

файл xslt :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="foo">
    <baz><xsl:apply-templates/></baz>
  </xsl:template>
</xsl:stylesheet>

ошибка:

Error at xsl:mode on line 9 column 41 of bc.rename.xslt:
  XTSE0010: Element xsl:mode must not appear directly within xsl:stylesheet
Error at xsl:mode on line 9 column 41 of bc.rename.xslt:
  XTSE0010: Unknown XSLT element: mode
Failed to compile stylesheet. 2 errors detected.

Как документ xml, так и xslt документ проходят xmllint без ошибок.

1 Ответ

1 голос
/ 19 июня 2020

xsl:mode требуется XSLT 3.0. AFAIK, Saxon 9.1 поддерживает только XSLT 2.0.

Попробуйте вместо этого:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

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

<xsl:template match="foo">
    <baz>
        <xsl:apply-templates/>
    </baz>
</xsl:template>

</xsl:stylesheet>
...