返回两个兄弟姐妹之间的一系列元素

时间:2015-05-27 10:47:31

标签: xml xslt

所以,我有这个XML:

<datafield tag="610">
    <subfield code="z">eng</subfield>
    <subfield code="a">zinc</subfield>
    <subfield code="a">speciation</subfield>
    <subfield code="a">pumpkin seeds</subfield>
    <subfield code="b">iceberg lettuce</subfield>
    <subfield code="a">size exclusion chromatography</subfield>
    <subfield code="a">element-specific detection</subfield>
    <subfield code="a">physiologically based extraction test</subfield>
</datafield>

我需要在<subfield code="z">eng</subfield><subfield code="b">iceberg lettuce</subfield>之间获取所有代码=“a”元素。然后,我需要在<subfield code="b">iceberg lettuce</subfield>之后获取所有代码=“a”元素。

我目前的代码:

<First>                        
    <xsl:for-each select="datafield[@tag=610]/subfield[@code='a']">
        <xsl:value-of select="." />
        <xsl:text> 
        </xsl:text>
    </xsl:for-each>                    
</First>                        
<Second>                        
    <xsl:for-each select="datafield[@tag=610]/subfield[@code='a']">
        <xsl:value-of select="." />
        <xsl:text> 
        </xsl:text>
    </xsl:for-each>                    
</Second>         

我没有找到任何XLST命令,我可以在其中定义for-each循环的范围,我不确定是否可以在纯XSLT中实现这一点。

这就是我在这里的原因。我更喜欢XSLT 1.0中的解决方案,但任何人都会这样做。

2 个答案:

答案 0 :(得分:1)

使用XSLT / XPath 2.0,路径表达式/datafield[@tag = 610]/subfield[@code = 'z']/following-sibling::subfield[@code = 'a' and . << ../subfield[@code = 'b']]将为您提供元素

<subfield code="a">zinc</subfield>
<subfield code="a">speciation</subfield>
<subfield code="a">pumpkin seeds</subfield>

请注意,在XSLT内部,您需要将<<运算符转义为&lt;&lt;

第二组更容易访问,您只需要/datafield[@tag = 610]/subfield[@code = 'b']/following-sibling::subfield[@code = 'a']

答案 1 :(得分:1)

在XSLT 1.0中,您可以这样做:

<xsl:template match="datafield[@tag=610]">
    <First>    
        <xsl:apply-templates select="subfield[@code='z']/following-sibling::subfield[@code='a'][following-sibling::subfield[@code='b']]"/>                    
    </First>                        
    <Second>                        
        <xsl:apply-templates select="subfield[@code='b']/following-sibling::subfield[@code='a']"/>                    
    </Second>
</xsl:template>

<xsl:template match="subfield">
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>