XPath: выбор узлов, включенных в <xsl: include> - PullRequest
0 голосов
/ 15 января 2010

Существует XSL, который включает в себя еще один XSL:

<xsl:include href="registered.xsl"/>

Этот файл содержит список узлов:

<g:registered>
  <node1/>
  <node2/>
</g:registered>

Документация гласит, что "дочерние элементы элемента <xsl:stylesheet> в этом документе заменяют элемент во включающем документе", поэтому я думаю, что с учетом директивы include я могу выбрать g: зарегистрированные узлы, как если бы они всегда принадлежал к входящему документу:

select="document('')/xsi:schema/g:registered"

Это возвращает пустой набор узлов.

Однако это:

select="document('registered.xsl')/xsi:schema/g:registered"

выбирает то, что требуется, но это, как я полагаю, означает, что второй раз открывается включенный файл, что мне не нравится.

Так как же выбрать эти включения, не открывая файл второй раз?

EDIT

Запрошенная структура документа: Включенный документ:

<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">

<g:registered-templates>
  <SampleTemplate/>
  <WrongTemplate/>
</g:registered-templates>

<xsl:include href="Sample Template.xsl" />
<xsl:include href="Wrong Template.xsl" />

</xsl:stylesheet>

Включая документ:

<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">

<xsl:output method="text"/>

<xsl:include href="Label Registration.xsl"/>

<!-- How do I refer to just loaded inclusion without directing engine to the file again? -->
<xsl:variable name="template-names" select="document('Label Registration.xsl')/xsl:stylesheet/g:registered-templates"/>

<xsl:template match="Job">
  <xsl:for-each select="WorkItem">
    <xsl:apply-templates select="$template-names/*[local-name()=current()/@name]">
      <xsl:with-param name="context" select="." />
    </xsl:apply-templates>
  </xsl:for-each>
</xsl:template>


</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 20 января 2010

Хорошо, мое понимание было неверным.

Функция document('') открывает файл в любом случае, поэтому он не имеет никаких преимуществ с точки зрения производительности по сравнению с document('registered.xsl'). И поскольку он запрашивает файл , а не измененную модель DOM текущего документа, результат не включает мои включения.

И, насколько мне известно, невозможно запросить модель DOM самого шаблона преобразования.

0 голосов
/ 18 января 2010

Выбор в вашей переменной template-names запрашивает исходный документ преобразования , а не включенную вами таблицу стилей. Если вы хотите сослаться на g :istered-templates, вы должны указать файл как второй исходный документ.

EDIT

Я не совсем уверен. но похоже, что вы хотите создать элемент в соответствии со значением атрибута. В этом случае этот пост будет вам интересен .

<xsl:for-each select="WorkItem">
    <xsl:element name="{Type}" >
        <xsl:value-of select="current()/@name"/>
    </xsl:element>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...