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

它应该选择employee没有Deleted子元素和Profile_Name= admin 或UserName = user 的元素,无论 profileName 和 UserName 的情况如何

它工作正常,但不考虑字符大小写。

它应该返回employee= id1 和 2

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()close 的谓词太早了。

可能你想要这个

        /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 回答
0

.NET XSLT 实现允许在样式表中编写自定义托管函数。对于小写(),它可以是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:utils="urn:myExtension" exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes"/>

  <msxsl:script implements-prefix="utils" language="C#">
    <![CDATA[
      public string ToLower(string stringValue)
      {
        string result = String.Empty;

        if(!String.IsNullOrEmpty(stringValue))
        {
          result = stringValue.ToLower(); 
        }

        return result;
      }
    ]]>
  </msxsl:script>

  <!-- using of our custom function -->
  <lowercaseValue>
    <xsl:value-of select="utils:ToLower($myParam)"/>
  </lowercaseValue>

假设这可能很慢,但仍然可以接受。

不要忘记为转换启用嵌入式脚本支持:

// Create the XsltSettings object with script enabled.
XsltSettings xsltSettings = new XsltSettings(false, true);

XslCompiledTransform xslt = new XslCompiledTransform();

// Load stylesheet
xslt.Load(xsltPath, xsltSettings, new XmlUrlResolver());
于 2013-12-30T11:38:23.103 回答