我选择了XML(已编辑)
<items>
<item id="00100537" label="A/137i r" lcn="005417713" notes="A/137-160"/>
<item id="00100538" label="A/137i v" lcn="" notes=""/>
<item id="00100539" label="A/137ii r" lcn="" notes=""/>
<item id="00100540" label="A/137ii v" lcn="" notes=""/>
<item id="00100678" label="A/159iii v" lcn="" notes=""/>
<item id="00100679" label="A/159iv r" lcn="" notes=""/>
<item id="00100680" label="A/159iv v" lcn="" notes=""/>
<item id="00100681" label="A/160i r" lcn="" notes=""/>
<item id="00100682" label="A/160i v" lcn="" notes=""/>
<item id="00100683" label="A/160ii r" lcn="" notes=""/>
<item id="00100684" label="A/160ii v" lcn="" notes=""/>
<item id="00100685" label="A/160iii r" lcn="" notes=""/>
<item id="00100686" label="A/160iii v" lcn="" notes=""/>
<item id="00100687" label="A/161i r" lcn="005417714" notes="A/161-182"/>
<item id="00100688" label="A/161i v" lcn="" notes=""/>
<item id="00100819" label="A/182ii v" lcn="" notes=""/>
<item id="00100820" label="A/182iii r" lcn="" notes=""/>
<item id="00100821" label="A/182iii v" lcn="" notes=""/>
<item id="00100822" label="A/183i r" lcn="005417715" notes="A/183-218"/>
<item id="00100823" label="A/183i v" lcn="" notes=""/>
<item id="00100975" label="A/216iii r" lcn="" notes=""/>
<item id="00100976" label="A/216iii v" lcn="" notes=""/>
<item id="00100977" label="A/217i r" lcn="" notes=""/>
<item id="00100978" label="A/217i v" lcn="" notes=""/>
<item id="00100979" label="A/217ii r" lcn="" notes=""/>
<item id="00100980" label="A/217ii v" lcn="" notes=""/>
<item id="00100981" label="A/218i r" lcn="" notes=""/>
<item id="00100982" label="A/218i v" lcn="" notes=""/>
<item id="00100983" label="A/218ii r" lcn="" notes=""/>
<item id="00100984" label="A/218ii v" lcn="" notes=""/>
<item id="00100985" label="A/219i r" lcn="005417716" notes="A/219-248"/>
<item id="00100986" label="A/219 v" lcn="" notes=""/>
<item id="00100987" label="A/219ii r" lcn="" notes=""/>
<item id="00101061" label="A/248 r" lcn="" notes=""/>
<item id="00101062" label="A/248 v" lcn="" notes=""/>
</items>
我希望能够在下一个lcn之前从给定的lcn获取所有后续节点。
如果我从lcn =&#39; 005417714&#39;开始我知道有4个以下节点。
但是当我尝试做这样的事情时
<xsl:for-each select="/items/item[@lcn='005417714']/following-sibling::*">
我得到所有跟随兄弟姐妹。如何在下一个非空的lcn属性之前获取所有后续兄弟姐妹?那么只检索以下4个兄弟姐妹?感谢
答案 0 :(得分:4)
使用xslt-1.0,您可以尝试使用此基于密钥的解决方案: (仅表明它是如何工作的)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kfItem" match="item[@lcn = '']"
use="generate-id(preceding-sibling::item[@lcn != ''][1])"/>
<xsl:template match="/*">
<items>
<xsl:apply-templates select="item[@lcn != '']"/>
</items>
</xsl:template>
<xsl:template match="item">
<lcn lcn="{@lcn}">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('kfItem', generate-id())"/>
</lcn>
</xsl:template>
</xsl:stylesheet>
将生成以下输出:
<items>
<lcn lcn="005417713">
<item id="00100537" label="A/137i r" lcn="005417713" notes="A/137-160"/>
<item id="00100538" label="A/137i v" lcn="" notes=""/>
<item id="00100539" label="A/137ii r" lcn="" notes=""/>
<item id="00100540" label="A/137ii v" lcn="" notes=""/>
<item id="00100678" label="A/159iii v" lcn="" notes=""/>
<item id="00100679" label="A/159iv r" lcn="" notes=""/>
<item id="00100680" label="A/159iv v" lcn="" notes=""/>
<item id="00100681" label="A/160i r" lcn="" notes=""/>
<item id="00100682" label="A/160i v" lcn="" notes=""/>
<item id="00100683" label="A/160ii r" lcn="" notes=""/>
<item id="00100684" label="A/160ii v" lcn="" notes=""/>
<item id="00100685" label="A/160iii r" lcn="" notes=""/>
<item id="00100686" label="A/160iii v" lcn="" notes=""/>
</lcn>
<lcn lcn="005417714">
<item id="00100687" label="A/161i r" lcn="005417714" notes="A/161-182"/>
<item id="00100688" label="A/161i v" lcn="" notes=""/>
<item id="00100819" label="A/182ii v" lcn="" notes=""/>
<item id="00100820" label="A/182iii r" lcn="" notes=""/>
<item id="00100821" label="A/182iii v" lcn="" notes=""/>
</lcn>
<lcn lcn="005417715">
<item id="00100822" label="A/183i r" lcn="005417715" notes="A/183-218"/>
<item id="00100823" label="A/183i v" lcn="" notes=""/>
<item id="00100975" label="A/216iii r" lcn="" notes=""/>
<item id="00100976" label="A/216iii v" lcn="" notes=""/>
<item id="00100977" label="A/217i r" lcn="" notes=""/>
<item id="00100978" label="A/217i v" lcn="" notes=""/>
<item id="00100979" label="A/217ii r" lcn="" notes=""/>
<item id="00100980" label="A/217ii v" lcn="" notes=""/>
<item id="00100981" label="A/218i r" lcn="" notes=""/>
<item id="00100982" label="A/218i v" lcn="" notes=""/>
<item id="00100983" label="A/218ii r" lcn="" notes=""/>
<item id="00100984" label="A/218ii v" lcn="" notes=""/>
</lcn>
<lcn lcn="005417716">
<item id="00100985" label="A/219i r" lcn="005417716" notes="A/219-248"/>
<item id="00100986" label="A/219 v" lcn="" notes=""/>
<item id="00100987" label="A/219ii r" lcn="" notes=""/>
<item id="00101061" label="A/248 r" lcn="" notes=""/>
<item id="00101062" label="A/248 v" lcn="" notes=""/>
</lcn>
</items>
答案 1 :(得分:2)
在XSLT 2.0中,您可以使用<xsl:for-each-group>
,特别是其group-starting-with
属性来迭代以非空lcn
开头的元素组。在XSLT 1.0中有各种可能性。最简单的方法就是
<xsl:for-each select="/items/item[@lcn='005417714']">
<xsl:for-each select="following-sibling::*[
generate-id(preceding-sibling::item[@lcn != ''][1])
= generate-id(current())]">
</xsl:for-each>
</xsl:for-each>
检查目标项目的所有以下兄弟,并选择那些最近的具有非空lcn
属性的兄弟姐妹是目标项目。
如果您想迭代所有“部分”而不是仅仅针对一个特定的部分,那么基于密钥的分组方法suggested by hr_117会更有效。