【问题标题】:Determine if a sibling node with text exists判断是否存在带文本的兄弟节点
【发布时间】:2012-01-20 15:16:43
【问题描述】:

我想使用following-sibling 确定一个节点是否包含字符串abc

到目前为止,我正在遍历每个 item 节点,我想确定 item 是否包含带有字符串 abcnode

这是我迄今为止尝试过的:

contains(node/following-sibling::node[text()], 'abc')

XML:

<doc>
<item>
<node>1abc2</node>
<node>4</node>
<node>x</node>
</item>
<item>
<node>1</node>
<node>2abcX</node>
<node>x</node>
</item>
</doc>

【问题讨论】:

    标签: xml xpath find selector


    【解决方案1】:

    如果您只想“确定item 是否包含带有字符串abcnode,那么您不需要following-sibling。使用它来选择所有此类节点:

    node[contains(., 'abc')]
    

    这与提供的两个 item 元素中的 node 匹配。

    如果您想检查具有以下兄弟姐妹node 的子node 与该文本,请使用:

    node[following-sibling::node[contains(., 'abc')]]
    

    这仅匹配第二个item 中的第一个node

    其中任何一个都可以使用boolean function 显式转换为布尔值。例如:

    boolean(node[following-sibling::node[contains(., 'abc')]])
    

    如果表达式选择了至少一个节点(即节点集非空),则返回 true。

    【讨论】:

      【解决方案2】:

      此 XSL 生成单个节点,只有 1 个“节点”后面有一个带有字符串“abc”的“节点”。

      <?xml version="1.0"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
      
      <xsl:template match="/">
      <doc>
          <xsl:for-each select='/doc/item/node[following-sibling::node[contains(.,"abc")]]'>
              <xsl:copy>
                  <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
          </xsl:for-each>
      </doc>
      </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 2018-09-06
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多