XSLT-检查具有命名空间的属性值
我试图使用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
<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”
的标记执行相同的操作?