Вопрос о том, как генерировать вещи на основе промежуточного результата XSLT - PullRequest
2 голосов
/ 07 февраля 2011

Обычно XSLT должен работать с исходным XML-файлом и иметь таблицу стилей.

Но в настоящее время моя задача заключается в том, чтобы моим последним узлом в окончательном XML-файле было число, которое учитывает определенные типы узлов в моем xml-файле RESULTING (а не в исходном).

Так, например, мой исходный XML пуст, и в моей таблице стилей я взял данные из некоторых других мест и вставил их в этот пустой XML, чтобы создать определенные узлы, подобные этому:

<Plant>
 <Flower>
   <Flower1>..</Flower1>
   <Flower2>..</Flower2>
 </Flower>

 <Tree>
   <Tree1>...</Tree1>
   <Tree2>...</Tree2>
 </Tree>

  ....

 <Counter>? </Counter>
</Plant>

Мой вопрос здесь об этом узле Counter, это должно быть число, которое указывает, сколько дочерних узлов Plant было создано после преобразования. Поэтому я бы предположил, что двухэтапный процесс может быть эффективным: первый шаг - создать промежуточный XSLT, который захватывает все данные «Plant» и заполняет пустой исходный XML-файл; Затем вторым шагом является простой подсчет XPath для этого XML-файла и добавление другого узла «Счетчик» для хранения этого числа. Но я не совсем уверен, как объединить эти два XSLT в один XSLT (поскольку требуется преобразование одним щелчком), например, как представить промежуточные XML-файлы и как выполнить команду IDE (в моем случае - XMLSpy). еще один XSLT.

Заранее спасибо.

1 Ответ

3 голосов
/ 07 февраля 2011

Вот общий способ обработки результата преобразования, включая подсчет его узлов :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

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

 <xsl:template match="/">
  <xsl:variable name="vrtfPass1">
   <top>
    <xsl:apply-templates select="*"/>
    <xsl:apply-templates select="*"/>
   </top>
  </xsl:variable>

  <xsl:variable name="vPass2" select="ext:node-set($vrtfPass1)"/>

  <xsl:value-of select="count($vPass2/*/*/*)"/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML :

<nums>
 <num>1</num>
 <num>2</num>
 <num>3</num>
 <num>4</num>
 <num>5</num>
</nums>

получен правильный результат :

10

В XSLT 1.0 (только) использование функции расширения xxx:node-set() обычнотребуется в многопроходной обработке.В XSLT 2.0 нет такого требования, которое устранило печально известный RTF-тип данных.

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