2

If I have the following XML:

<items>
  <item>
    <subItem>
      <name>myName</name>
    </subitem>
    <subitem>
      <val>Val1</val>
      <val>Val2</val>
    </subItem>
  </item>
  <item>
     ...more tags here
  </item> 
</items>

The item element repeats a number of times with different values. If I know the value in the val element I want to match, for instance Val1, what do I use for a template to select the name element value myName in the subItem above it?

4

4 回答 4

1

尝试

item[subItem/val='value']

这表示“选择一个包含文本内容为‘值’的子项/val 的项目”

于 2012-08-17T21:23:01.580 回答
0

提供的 XML 格式不正确:<subItem>开始标记有一个</subitem>结束标记,而下一个<subitem>开始标记有一个<subItem>结束标记。

请记住,XML 名称区分大小写

如果格式错误问题得到修复,并且在更正、格式正确的文档中仅使用小写名称,

用作匹配模式

item[subitem/val = 'Val1']/subitem/name

这匹配作为 a 的子元素的任何元素name,该子元素是具有至少一个子元素的子元素,该子元素具有至少一个具有字符串 value的子元素。subitemitemsubitemval"Val1"

xsl:template指令

<xsl:template match="item[subitem/val = 'Val1']/subitem/name">
  <!-- Any desired processing here -->
</xsl:template>

请注意

此解决方案与subitem元素的顺序无关,即使它们被重新排序也能正常工作,例如,subitem有一个name孩子的就是所有subitem孩子中的最后一个。

于 2012-08-18T04:05:55.443 回答
0

我自己不必执行相同的选择。在不了解您为什么这样做的上下文的情况下,我假设您想要所选 XML 元素的前一个兄弟元素。

话虽如此,这篇博文可能会对您有所帮助:Using XPath's 'preceding-sibling' Axis Correctly

于 2012-08-17T20:53:00.347 回答
0

所以基本上我认为你真正想要的是:

//val[. = 'Val1' and parent::subItem]/parent::subItem/preceding-sibling::subItem[1]/name

它将选择所有val子元素subItem并具有指定值,在这种情况下Val1,然后导航到前一个subItem元素的名称。当然,您可以对其进行调整以更好地满足您的需要。

于 2012-08-17T21:50:29.460 回答