XSLT 1.0 Тест, если узел, переданный с call-шаблоном, является последним из потомков родителя - PullRequest
1 голос
/ 07 января 2012
<TEI>
    <text id="R">
    <text id="E">
    <text id="D">
</TEI>

Если я вызову шаблон и передам узел <text id="E"> в качестве параметра, какое тестовое выражение, выполненное внутри шаблона, проверит, является ли текст E последним из <TEI> потомков?

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Если я вызову шаблон и передам узел <text id="E"> в качестве параметра, какое тестовое выражение, выполненное внутри шаблона, проверит, является ли текст E последним из <TEI> потомков?

Я предполагаю, что под детьми <TEI> вы подразумеваете <TEI> ' element -children .

Если это так, используйте:

not($p/following-sibling::*[1])

вышеупомянутое может быть более эффективным (если оптимизатор XPath не слишком умен), чем эквивалент:

not($p/following-sibling::*)

В случае, если по <TEI> дети, вы имеете в виду <TEI> тип любого узла (текст, комментарий, PI и элемент) - потомки, затем используйте это выражение XPath :

not($p/following-sibling::node()[1])
2 голосов
/ 07 января 2012

Предполагая, что имя параметра в вашем шаблоне было element , вы могли бы добиться этого, проверив, есть ли какие-либо последующие элементы этого элемента

<xsl:value-of select="not($element/following-sibling::*)" />

Итак, учитывая следующееXSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/TEI">
    <xsl:call-template name="text">
      <xsl:with-param name="element" select="text[@id='E']"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="text">
    <xsl:param name="element" />
    <xsl:choose>
        <xsl:when test="not($element/following-sibling::*)">Last</xsl:when>
        <xsl:otherwise>Not Last</xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Применительно к следующему XML

<TEI> 
    <text id="R" /> 
    <text id="E" /> 
    <text id="D" /> 
</TEI> 

Выводится следующее

Not Last

Изменить параметр на E элемент, следующий он выводит вместо

Last

Однако, если возможно, может быть лучше избежать использования call-template с параметром.Лучшим шаблоном дизайна будет использование apply-templates здесь

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/TEI">
    <xsl:apply-templates select="text[@id='D']" />
  </xsl:template>

  <xsl:template match="text[following-sibling::*]">
    <xsl:text>Not Last</xsl:text>
  </xsl:template>

  <xsl:template match="text">
    <xsl:text>Last</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Это также должно дать те же результаты

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