Включение нескольких XSL в один - PullRequest
0 голосов
/ 13 мая 2019

При работе с преобразованием XML я хотел бы объединить несколько XSL, чтобы можно было легко повторно использовать фрагменты кода.

Работает следующее: Gender.xslt

<?xml version="1.0" encoding="iso-8859-1" ?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/person/gender" name="gender">
    <Geslacht>
            <Code>
                <xsl:apply-templates select="genderCode" />
            </Code>
            <Omschrijving>
                <xsl:if test="genderCode=1">Mannelijk</xsl:if>
                <xsl:if test="genderCode=2">Vrouwlijk</xsl:if>
            </Omschrijving>
        </Geslacht>
    </xsl:template>
</xsl:stylesheet>

При применении к следующему XML-файлу:

<?xml version="1.0" encoding="UTF-16" ?>
<person>
    <gender>
        <genderCode>1</genderCode>
    </gender>
</person>

Я получаю следующий ожидаемый результат

<?xml version="1.0" encoding="UTF-8"?>
<Geslacht>
    <Code>1</Code>
    <Omschrijving>Mannelijk</Omschrijving>
</Geslacht>

Аналогичным образом я преобразую идентификатор:

ID.xslt

<?xml version="1.0" encoding="iso-8859-1" ?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/person" name="ssin">
    <INSZ>
            <xsl:apply-templates select="ssin" />
    </INSZ>
</xsl:template>
</xsl:stylesheet>

Применимо к

<?xml version="1.0" encoding="UTF-16" ?>
<person>
    <ssin>123456789</ssin>
</person>

Дает

<?xml version="1.0" encoding="UTF-8"?>
<INSZ>123456789</INSZ>

Теперь я хотел бы объединить два

Учитывая следующие данные:

<?xml version="1.0" encoding="UTF-16" ?>
<person>
    <ssin>1234567891234</ssin>
    <gender>
        <genderCode>1</genderCode>
    </gender>
</person>

Я хотел бы получить следующий результат

<?xml version="1.0" encoding="UTF-8"?>
<Persoon>
    <INSZ>1234567891234</INSZ>
    <Geslacht>
        <Code>1</Code>
        <Omschrijving>Mannelijk</Omschrijving>
    </Geslacht>
</Persoon>

Моя таблица стилей:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Gender.xslt" />
<xsl:include href="ID.xslt" />

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <Persoon>
        <xsl:call-template name="gender" />
        <xsl:call-template name="ssin" />
        <xsl:apply-imports />
    </Persoon>
</xsl:template>

Проблема в том, что вызывается таблица стилей пола, но результат пуст;структура, но нет данных.Часть SSIN работает как шарм.

Любая помощь очень ценится!

Барри

1 Ответ

1 голос
/ 13 мая 2019

Я бы предложил реализовать первое преобразование как

<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:param name="gender-descriptions" as="xs:string*"
    select="'Mannelijk', 'Vrouwlijk'"/>

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="person/gender">
      <Geslacht>
          <xsl:apply-templates/>
      </Geslacht>
  </xsl:template>

  <xsl:template match="gender/genderCode">
      <Code>
          <xsl:value-of select="."/>
      </Code>
      <Omschrijving>
          <xsl:value-of select="$gender-descriptions[position() = current()]"/>
      </Omschrijving>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / gWvjQfG

Второе преобразование может быть реализовано какуже указано в комментарии:

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

  <xsl:template match="person/ssin">
      <INSZ>
          <xsl:apply-templates/>
      </INSZ>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / gWvjQfG / 1

Тогда импортируемая таблица стилей просто выполнит

  <xsl:template match="person">
      <Persoon>
          <xsl:apply-templates/>
      </Persoon>
  </xsl:template>

(https://xsltfiddle.liberty -development.net / gWvjQfG / 2 содержит все шаблоны, включенные в текстовом виде, а не импортированные, но результат такой, какой вы хотите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...