XSLT - передача документа в качестве параметра в шаблон не работает - PullRequest
0 голосов
/ 06 февраля 2020

Я собираю данные из двух разных xml файлов с помощью таблицы стилей xsl. Когда я нахожусь в основном шаблоне, который фильтрует правильный DOM из другого файла xml, я хочу передать этот DOM другому шаблону для получения только необходимой информации обратно. Но здесь я застрял, потому что кажется, что я не могу передать структуру DOM с помощью «xsl: with-param». Когда я пробую вывод в под-шаблоне, переданный параметр будет пустым.

<xsl:variable name="data" select="/entry/document('data.xml')/documents" />

<xsl:template match="/">
    <xsl:param name="matchingNodes" select="$data/document[documentInfos/documentInfo[documentInfoField = '120']/content/value = current()/ARTICLE]"/>

    <xsl:if test="count($matchingNodes)">
        <xsl:call-template name="PRODUCT_NAME">
            <xsl:with-param name="matchingNodes" select="$matchingNodes"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<xsl:template name="PRODUCT_NAME"/>
  <xsl:param name="matchingNodes"/> <-- this is empty
  ...
</xsl:template>

Как я могу получить отфильтрованный документ в шаблоне или это даже невозможно?

ОБНОВЛЕНИЕ

Первый XML файл является вторым. Первый - для проверки, действительно ли статья находится в этом, чтобы разрешить преобразование.

#First XML
<?xml version="1.0" encoding="utf-8"?>
<entry>
  <documents>
    <document>
      <name>Product A</name>
      <id>100-123</id>
      <documentInfos>
        <documentInfo>
            <locales>[de]</locales>
            <content>
              <language>de</language>
              <value>100</value>
            </content>
          <documentInfoField type="">120</documentInfoField>
        </documentInfo>
      </documentInfos>
    </document>
    <document>
      <name>Product B</name>
      <id>200-124</id>
      <documentInfos>
        <documentInfo>
            <locales>[en]</locales>
            <content>
              <language>de</language>
              <value>210</value>
            </content>
          <documentInfoField type="">120</documentInfoField>
        </documentInfo>
      </documentInfos>
    </document>
  </documents>
</entry>

# Second XML
<?xml version="1.0" encoding="utf-8"?>
<TREE>
  <BLOCK>
    <STATUS>1</STATUS>
    <ARTICLE>100</ARTICLE>
  </BLOCK>
  <BLOCK>
    <STATUS>1</STATUS>
    <ARTICLE>200</ARTICLE>
  </BLOCK>
</TREE>

ОБНОВЛЕНИЕ 2

Теперь это работает! Я не понимаю!?! Я могу получить доступ к этому переданному параметру только тогда, когда я называю его, например,

<xsl:template name="PRODUCT_NAME"/>
  <xsl:param name="matchingNodes"/>
  <xsl:value-of select="$matchingNodes"/>
</xsl:template>

Но тогда возникает новая проблема. Мне нужно сопоставить только название продукта внутри этого шаблона, и теперь я увидел, что должен использовать аргумент "соответствия" в определении шаблона следующим образом:

<xsl:template match="documentInformationEntry[documentInformationField = '100']/content[language = 'de']/value>

1 Ответ

0 голосов
/ 06 февраля 2020

У вас есть несколько проблем. Во-первых, ваша переменная $data пуста. Это можно проверить, выполнив следующий тест:

<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:variable name="data" select="document('data.xml')/documents" />

<xsl:template match="/">
    <test>
        <xsl:copy-of select="$data"/>
    </test>
</xsl:template>

</xsl:stylesheet>

Он пуст, поскольку элемент root в data.xml равен entry, а не documents. А также потому, что данные. xml не являются правильно сформированным документом XML (по крайней мере, не тот пример, который вы опубликовали здесь).

Кроме того, выражение, выбирающее переменную $matchingNodes, также выбирает ничего - по крайней мере, не в приведенном примере. Например, выражение current()/ARTICLE всегда будет пустым, поскольку ARTICLE не является дочерним элементом текущего узла /. И путь к value тоже неверен.

К сожалению, я не могу исправить это для вас, потому что я не знаю, как на самом деле выглядит документ data.xml. Или чего вы на самом деле пытаетесь достичь.

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