1

xmlファイルは次のようになります

<employees>    
 <employee id='1'>
  <Profile_Name>admin</Profile_Name>
  <UserName>user</UserName>
 </employee>

 <employee id='2'>
  <Profile_Name>Admin</Profile_Name>
  <UserName>USER</UserName>
 </employee>

 <employee id='3'>
  <Profile_Name>Adminnn</Profile_Name>
  <UserName>userrrr</UserName>
 </employee>

これが私のxpathです

         employees/employee
                     [not(Deleted)]
                       [Profile_Name[last()]
                          [translate(., 
                                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                     'abcdefghijklmnopqrstuvwxyz'
                                     )
                          ]
                          =
                           'admin'or 
                           UserName[last()]
                                    [translate(.,
                                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                                'abcdefghijklmnopqrstuvwxyz'
                                              )
                                    ]
                               =
                                'user'
                         ]

profileNameとUserNameの場合に関係なく、子employeeを持たない要素と=adminまたは=userを選択する必要がありますDeletedProfile_NameUserName

正常に動作しますが、大文字と小文字は考慮されません。

=1と2employeeで戻る必要がありますid

4

3 に答える 3

1

間違った場所に翻訳があります。コードが生成する XPath 式は、次のようなものをテストします。

Profile_Name[last()][translate(.,'ABCDE...', 'abcde...')] = 'foo'

つまり、最後のProfile_Name要素を見つけ、その要素に空でない値があることを確認し、その値 (例: Foo) を文字列と比較しますfoo。代わりに、必要です

translate(Profile_Name[last()],'ABCDE...', 'abcde...') = 'foo'

生の値ではなく、変換された値で比較を行います。完全な式は次のようになります。

 var xpath = "/employees/employee[not(Deleted)][translate(Profile_Name[last()],'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='" + ProfileName.ToLower() + "' or translate(UserName[last()],'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='" + UserName.ToLower() + "']";
于 2012-12-10T13:22:41.687 に答える
1

現在、これがあります(読みやすいように適切にフォーマットされています):

           /employees/employee
                     [not(Deleted)]
                       [Profile_Name[last()]
                          [translate(Profile_Name[last()], 
                                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                     'abcdefghijklmnopqrstuvwxyz'
                                     )
                          ]
                          =
                           'admin'or 
                           UserName[last()]
                                    [translate(.,
                                               'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                                'abcdefghijklmnopqrstuvwxyz'
                                              )
                                    ]
                               =
                                'user'
                         ]";

これは明らかに間違っています。述語を含む述語がtranslate()閉じるのが早すぎます。

おそらくあなたはこれが欲しい

        /employees/employee
                     [not(Deleted)]
                           [translate(Profile_Name[last()], 
                                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                     'abcdefghijklmnopqrstuvwxyz'
                                     )
                          =
                           'admin'
                         or 
                           translate(UserName[last()],
                                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                      'abcdefghijklmnopqrstuvwxyz'
                                      )
                           =
                            'user'
                            ]

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=
     "/employees/employee
                     [not(Deleted)]
                           [translate(Profile_Name[last()],
                                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                     'abcdefghijklmnopqrstuvwxyz'
                                     )
                          =
                           'admin'
                         or
                           translate(UserName[last()],
                                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                      'abcdefghijklmnopqrstuvwxyz'
                                      )
                           =
                            'user'
                      ]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用された場合(提供されたものに基づいていますがemployee、テストに必要なケースを提供するためにさらに要素を追加しました):

<employees>
    <employee id='1'>
        <Profile_Name>admin</Profile_Name>
        <UserName>user</UserName>
    </employee>
    <employee id='2'>
        <Profile_Name>Admin</Profile_Name>
        <UserName>USER</UserName>
    </employee>
    <employee id='3'>
      <Deleted/>
        <Profile_Name>Admin</Profile_Name>
        <UserName>user</UserName>
    </employee>
    <employee id='4'>
        <Profile_Name>Adminnn</Profile_Name>
        <UserName>userrrr</UserName>
    </employee>
</employees>

Xpath 式が評価され、この評価の結果が出力にコピーされます。

<employee id="1">
   <Profile_Name>admin</Profile_Name>
   <UserName>user</UserName>
</employee>
<employee id="2">
   <Profile_Name>Admin</Profile_Name>
   <UserName>USER</UserName>
</employee>
于 2012-12-10T13:25:52.417 に答える