XSLT-检查具有命名空间的属性值

XSLT-检查具有命名空间的属性值,xslt,xslt-2.0,Xslt,Xslt 2.0,我试图使用XSLT检查属性(带有名称空间)值并更改标记的值 输入: <Datalist> <username xmlns="http:sps.in" nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> </Datalist> <Datalist> <username xmlns="http:sps.in" nil="true" xml

我试图使用XSLT检查属性(带有名称空间)值并更改标记的值

输入:

<Datalist> 
     <username xmlns="http:sps.in" nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
</Datalist>
<Datalist> 
     <username xmlns="http:sps.in" nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">NULL</Datalist> 
</Datalist>

所需输出:

输入:

<Datalist> 
     <username xmlns="http:sps.in" nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
</Datalist>
<Datalist> 
     <username xmlns="http:sps.in" nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">NULL</Datalist> 
</Datalist>

无效的
我编写了以下XSL,它在没有名称空间的情况下工作。我应该如何更改它以使用名称空间

<xsl:stylesheet version="2.0" xmlns="http:sps.in" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
   <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

<xsl:template match="Datalist/username">
  <xsl:choose>
    <xsl:when test="@nil='true'">
         <username>NULL</username>
    </xsl:when>
    <xsl:otherwise>
        <username>NOTNULL</username>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

无效的
NOTNULL

虽然XSLT 2.0支持
xpath默认名称空间
来设置假定用于非前缀名称的名称空间URI,但这在这里对您没有帮助,因为您需要匹配作为非名称空间元素的子元素的名称空间元素

必须将前缀绑定到样式表中的
http:sps.in
,然后在匹配表达式中使用该前缀:

<xsl:stylesheet version="2.0" xmlns="http:sps.in" xmlns:sps="http:sps.in"
    exclude-result-prefixes="sps"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- ... -->

  <xsl:template match="Datalist/sps:username">


@nil
应该仍然有效,因为示例中的
nil
属性本身不在名称空间中。如果它是
xsi:nil
,那么您需要以相同的方式在样式表中绑定
xsi
前缀。

我想要的是
xsi:nil
,这样就可以了。谢谢。这是一个相关的问题。在
中,否则
部分我不想做任何更改。我该怎么做?删除
否则
不起作用。@Bhathiya我会删除
选择
,取而代之的是让模板只匹配
nil
者-
-这样非nil者将使用身份模板。酷。。。这就是我想要的。:)最后一个问题。是否可以对所有具有
xsi:nil=“true”
的标记执行相同的操作?