2016-11-30 6 views
1

Дано:Технологические узлы между двумя узлами или прекратить обработку при достижении определенного узла, XSLT 1.0 XPATH

<illustratedPartsCatalog> 
    <figure id="fig1">...</figure> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <figure id="fig2">...</figure> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
    <catalogSeqNumber>...</catalogSeqNumber> 
</illustratedPartsCatalog> 

Каждая фигура получает свою собственную таблицу <catalogSeqNumber>s, но сейчас таблица Figure1 также включает в себя записи для Figure2 и наоборот. Обработка <catalogSeqNumber> должна прекратиться, когда она достигнет следующей цифры.

решаемые с ответом Томалак в:

<xsl:template match="illustratedPartsCatalog"> 
    <xsl:apply-templates /> 
</xsl:template> 

Я добавил это к концу <xsl:template match="figure">

<xsl:if test="following-sibling::*[1][self::catalogSeqNumber] and ancestor::illustratedPartsCatalog"> 
    <xsl:call-template name="PI-TABLE"/> 
</xsl:if> 

И добавил это PI-TABLE (который строит таблицу <catalogSeqNumber>):

<xsl:apply-templates select="key('kCSN', @id)" /> 

ответ

0

<xsl:key> может помочь вам в этом.

<xsl:key name="kCSN" match="catalogSeqNumber" use="preceding-sibling::figure[1]/@id"> 

<xsl:template match="illustratedPartsCatalog"> 
    <xsl:apply-templates select="figure" /> 
</xsl:template> 

<xsl:template match="figure"> 
    <container> 
    <xsl:apply-templates select="key('kCSN', @id)" /> 
    </container> 
</xsl:template> 

<xsl:template match="catalogSeqNumber"> 
    <!-- catalogSeqNumber processing ... --> 
</xsl:template> 

Здесь основные индексы все <catalogSeqNumber> элементов с помощью @Id из immediateley предыдущего <figure>.

Теперь, когда мы обрабатываем только элементы <figure>, мы можем легко найти соответствующие элементы <catalogSeqNumber> с функцией key().

+0

Блестяще, спасибо, Томалак. Я видел '', используемый в аналогичном вопросе, но я не мог понять, как его изменить. – Caroline

+0

Существует объяснение xsl: ключ, который я написал ранее, возможно, это поможет вам обернуть вокруг себя голову. http://stackoverflow.com/questions/948218/xslt-3-level-grouping-on-attributes/955527#955527 – Tomalak

+0

Danke, Tomalak. – Caroline