所以,我有这个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中的解决方案,但任何人都会这样做。
答案 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内部,您需要将<<
运算符转义为<<
。
第二组更容易访问,您只需要/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> </xsl:text>
</xsl:template>