3

ノードの属性の値に文字列/文字シーケンスの「n」回の繰り返しがあるノードを選択することは可能ですか?

例えば:

<IOCFG xmlns="http://www.br-automation.com/AR/IO" Version="2.0">
    <Module ID="$root.IO" Hardware="X20CP1484">
    </Module>
    <Module ID="$rot.IO" Hardware="X20CP1484">
    </Module>
    <Module ID="$rt.IO" Hardware="X20CP1484">
    </Module>
    **<Module ID="IF3.IF1.ST9" Hardware="Hello"/>**
    <Module ID="IF3.IF2.IF3.ST9" Hardware="Bye"/>
    **<Module ID="IF3.IF2.ST1" Hardware="hai"/>**
</IOCFG>

上記のファイルからは、「IF」文字列が2回出現するID(属性)のノードしか選択できませんでした。

4

3 に答える 3

6

XPath 2.0を使用している場合は、count(tokenize(., 'IF'))=3IFが2回表示されるかどうかをテストします。

于 2012-09-06T13:20:11.570 に答える
3

このXPath式を使用します

/*/*
   [translate(@ID, translate(@ID, 'IF', ''), '')='IFIF']

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/*
      [translate(@ID, translate(@ID, 'IF', ''), '')='IFIF']

     "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<IOCFG xmlns="http://www.br-automation.com/AR/IO" Version="2.0">
<Module ID="$root.IO" Hardware="X20CP1484">
</Module>
<Module ID="$rot.IO" Hardware="X20CP1484">
</Module>
<Module ID="$rt.IO" Hardware="X20CP1484">
</Module>
**<Module ID="IF3.IF1.ST9" Hardware="Hello"/>**
<Module ID="IF3.IF2.IF3.ST9" Hardware="Bye"/>
**<Module ID="IF3.IF2.ST1" Hardware="hai"/>**
</IOCFG>

XPath式が評価され、選択した要素が出力にコピーされます。

<Module xmlns="http://www.br-automation.com/AR/IO" ID="IF3.IF1.ST9" Hardware="Hello"/>
<Module xmlns="http://www.br-automation.com/AR/IO" ID="IF3.IF2.ST1" Hardware="hai"/>

注意してください

これは、属性の値に特定のプロパティがあることを前提とした大まかなID解決策です(提供されたXMLのように)。この仮定が破られた場合、同じXPath式で正しい結果が得られない可能性があります。

ID属性に文字列"IF"が正確に2回含まれている要素のみを選択する正確なXPath1.0式は次のとおりです。

  /*/*
  [contains(@ID, 'IF')
  and contains(substring-after(@ID, 'IF'), 'IF')
  and not(contains(
              substring-after(substring-after(@ID, 'IF'),'IF'),
              'IF')
          )
  ]
于 2012-09-06T13:23:43.677 に答える
2

XPathを使用して一致をカウントする方法を知りませんが、substring-after関数を使用してチートできます。

//*[contains(substring-after(@id, "IF"), "IF")]

これは、文字列「IF」の後に文字列「IF」を含むID属性を持つすべての要素を検索します(これは「IF」を2回実行することに相当します)。私が望むほど読みやすくはありませんが、機能します。このインタラクティブなxpathテスターを使用してテストしました:http://ponderer.org/download/xpath/

編集:他のトムが指摘したように、これは2つ以上の「IF」を持つIDと一致します。正確に2つの「IF」を持つIDのみに一致させるには、次のようにする必要があります。

//*[contains(substring-after(@id, "IF"), "IF") and not(contains(substring-after(substring-after(@id, "IF"), "IF"), "IF"))]

しかし、それは私にはかなり醜いように見えます(2つ以上の「IF」を持つIDと一致しますが、3つ以上の「IF」を持つIDとは一致しません)。

于 2012-09-06T11:39:30.063 に答える