2012-01-07 1 views
1
<TEI> 
    <text id="R"> 
    <text id="E"> 
    <text id="D"> 
</TEI> 

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

ответ

2

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

Я полагаю, что <TEI> 's детей вы имеете в виду <TEI>' s элемент -дети.

Если да, то использовать:

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

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

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

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

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

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

<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 с параметром. Лучший шаблон дизайна будет сделать использование применять-шаблоны здесь

<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> 

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

+0

Спасибо. Я пробовал последний(), но знал, что это неправильно. – JPM

Смежные вопросы