处理两个节点之间的节点或在到达某个节点XSLT 1.0 XPATH时停止处理

时间:2016-11-30 17:42:45

标签: xml xpath xslt-1.0

假设:

<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表,但现在图1表还包含图2的条目,反之亦然。 <catalogSeqNumber>的处理应该在到达下一个数字时停止。

解决了Tomalak的回答:

<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)" />

1 个答案:

答案 0 :(得分: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索引所有<figure>个元素。

现在,当我们只处理<figure>元素时,我们可以使用<catalogSeqNumber>函数轻松提取关联的key()元素。