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']

これは、「テキスト コンテンツが 'value' である subitem/val を含むアイテムを選択する」ことを示しています。

于 2012-08-17T21:23:01.580 に答える
0

提供されたXMLは整形式ではありません。<subItem>開始タグには</subitem>終了タグがあり、次の<subitem>開始タグには<subItem>終了タグがあります。

XML名では大文字と小文字が区別されることに注意してください

不正な形式の問題が修正され、修正された整形式のドキュメントで小文字の名前のみが使用されている場合、

マッチパターンとして使用

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

これは、文字列値を持つ子が少なくとも1つある、子が少なくとも1つあるの子であるaの子であるすべてnameの要素に一致します。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

基本的に、あなたが本当に望んでいたのは次のとおりだと思います:

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

この場合、子であり、指定された値を持つすべてのval要素を選択し、前の要素の名前に移動します。もちろん、ニーズに合わせて調整することもできます。subItemVal1subItem

于 2012-08-17T21:50:29.460 に答える
0

私自身は、これと同じ選択を行う必要はありませんでした。これを行っている理由のコンテキストについて詳しく知ることなく、選択した XML 要素の前の兄弟が必要であると推測しています。

そうは言っても、このブログ投稿が役立つかもしれません: Using XPath's 'preceding-sibling' Axis Correctly

于 2012-08-17T20:53:00.347 に答える