我尝试使用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>
答案 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
前缀。