2

私はこのxmlを持っています:

    <mappings>      
        <mapping>       
           <name iskey="true">234</name>     
           <aid iskey="true">bmz</aid>    
           <bid iskey="true">sim</bid>    
           <data>GSSS</data>     
        </mapping>     
        <mapping>     
          <aid iskey="true">bmz</aid>     
          <bid iskey="true">sim</bid>    
          <data>TS</data>    
        </mapping>    
        <mapping>    
          <aid iskey="true">bmz</aid>
          <account>TS</account>     
        </mapping> 
     </mappings> 

<aid iskey='true'>bmz</aid>ノードがあり、iskey属性を含む他のノードがないノードを選択するには、xpathが必要です。

4

2 に答える 2

4

コメントを何度か行ったり来たりした後、特定の属性と値を持つ子ノードはあるが、その属性を持つ他の子ノードはないmappingノード(またはその他のノード)を取得しようとしているようです。あなたはこのようにします:aid@iskey

//*[aid/@iskey='true' and aid/text()='bmz'][not(*[@iskey][local-name() != 'aid'])]

述語は正確に次のように述べていaidます。これらの値を持つ子ノードがあり、それ以外の名前の子ノードがない場合、aidたまたま@iskey属性があります。

この単純なテストスタイルシートを実行すると、次のようになります。

<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="//*[aid/@iskey='true' and aid/text()='bmz'][not(*[@iskey][local-name() != 'aid'])]"/>
    </xsl:template> 
</xsl:stylesheet>

あなたの入力文書で私は見返りに以下を受け取ります:

<mapping>
    <aid iskey="true">bmz</aid>   <!-- I need this node -->
    <account>TS</account>
</mapping>

ノードが1つしかないノードを取得しようとしている場合は@iskey、次の方法で回避できます。

//*[count(*[@iskey]) = 1]

それをテストスタイルシートに接続すると、同じ期待される結果が得られました。

<mapping>
    <aid iskey="true">bmz</aid>   <!-- I need this node -->
    <account>TS</account>
</mapping>
于 2012-05-11T20:22:33.677 に答える
3

次の短くて単純な XPath 式を使用します

   /*/*
     [aid[@iskey='true' and .='bmz']
    and
      not(*[not(self::aid)][@iskey])
      ]

説明:

これは、「二重否定の原則」の単純で具体的なケースです:)

XSLT ベースの検証:

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

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/*
     [aid[@iskey='true' and .='bmz']
    and
      not(*[not(self::aid)][@iskey])
      ]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<mappings>
    <mapping>
        <name iskey="true">234</name>
        <aid iskey="true">bmz</aid>
        <bid iskey="true">sim</bid>
        <data>GSSS</data>
    </mapping>
    <mapping>
        <aid iskey="true">bmz</aid>
        <bid iskey="true">sim</bid>
        <data>TS</data>
    </mapping>
    <mapping>
        <aid iskey="true">bmz</aid>
        <account>TS</account>
    </mapping>
</mappings>

XPath 式が評価され、選択された要素 (この場合は 1 つだけ) が出力にコピーされます

<mapping>
   <aid iskey="true">bmz</aid>
   <account>TS</account>
</mapping>
于 2012-05-12T03:55:40.057 に答える