【问题标题】:selecting every node and siblings until next occurrence选择每个节点和兄弟节点,直到下一次出现
【发布时间】:2018-11-03 09:23:51
【问题描述】:

有了这个 xml 结构:

<doc>
    <members>
    <member name="T:XXX">
    </member>
    <member name="F:YYY">
    </member>
    <member name="P:ZZZ">
    </member>
    <member name="T:XXX">
    </member>
</doc>

我尝试获取名称属性以“T:”开头的节点之后的所有节点,直到名称属性以“T:”开头的下一个节点。 p>

基于这个 stackoverflow 主题 (#40767321),我找到了一个几乎完美的答案。

使用下面的 xsl:key,它需要第一个 T: 节点和所有追随者,但它还包括下一个 T: 选择中的节点。 我该如何排除它?

<xsl:key name="subMembers" match="member" use="generate-id(preceding-sibling::*[contains(@name, 'T:')][1])" />

感谢您的帮助!

【问题讨论】:

    标签: xslt xslt-1.0 xslt-grouping


    【解决方案1】:

    在处理ol 元素后跟div 元素的链接主题中,键仅匹配div 元素。但是,在您的问题中,T: 节点代表 ol 元素,关键是匹配这些元素。

    您需要替换密钥以忽略 T: 节点

    <xsl:key name="subMembers" match="member[not(starts-with(@name, 'T:'))]" use="generate-id(preceding-sibling::*[starts-with(@name, 'T:')][1])" />
    

    因此,假设您从选择 T: 节点开始,您将选择这些节点以及相关的节点,如下所示:

     <xsl:copy-of select="self::*|key('subMembers', generate-id())" />
    

    (如果您还希望转换组元素,也可以使用xsl:for-eachxsl:apply-templates)。

    试试这个 XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:key name="subMembers" match="member[not(starts-with(@name, 'T:'))]" use="generate-id(preceding-sibling::*[starts-with(@name, 'T:')][1])" />
    
    <xsl:template match="members">
        <members>
            <xsl:for-each select="member[starts-with(@name, 'T:')]">
                <group>
                    <xsl:copy-of select="self::*|key('subMembers', generate-id())" />
                </group>
            </xsl:for-each>
        </members>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 好的,我想我明白了,我会尽力回复你的!谢谢!
    • 我试过了,这是完美的!我使用了xsl:foreachcall-template 而不是xsl:copy-of。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多