XSLT - 使用命名空间检查属性值

时间:2014-03-25 19:17:46

标签: 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" 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>

1 个答案:

答案 0 :(得分:0)

虽然XSLT 2.0支持xpath-default-namespace来设置为非前缀名称假定的名称空间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前缀。