某些命名空间中的XSLT过滤节点

时间:2016-08-31 11:02:00

标签: xml xslt filter

我(非常)是XSLT的新手,希望有人能告诉我如何根据节点定义的命名空间在XML文档中使用XSLT过滤掉某些节点。我有以下简化示例:

Input:

<root 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="xxx:yyy:datamodel:SW:ABCD:01 AB_01.xsd" 
    xmlns="xxx:yyy:datamodel:SW:ABCD:01">   

    <Document xmlns="ABCD:ZYX:01">
        <TypeCode>SEC</TypeCode>
    </Document>
    <Document xmlns="ABCD:NOP:01">
        <TypeCode>DEC</TypeCode>
    </Document> 
</root>

输出:

SEC

所以我只想解析Namespace ABCD中的Document节点:ZYX:01。

到目前为止,这是我的xslt:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sec="xxx:yyy:datamodel:ABCD:ZYX:01"
    version="1.0">
    <xsl:template match="sec:TypeCode">
       <xsl:for-each select="//*[local-name() = 'TypeCode']">
            <xsl:value-of select="." />
       </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

提前致谢!

1 个答案:

答案 0 :(得分:1)

在您的XSLT中,您已经定义了一个命名空间&#34; xxx:yyy:datamodel:ABCD:ZYX:01&#34;,但是在您的XML中,您想要的TypeCode位于&#34;的默认命名空间中。 ABCD:ZYX:01&#34;,所以你在XSLT中的模板匹配实际上并不匹配。

你可能想做这样的事......

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
                xmlns:sec="ABCD:ZYX:01">
    <xsl:output method="text" />

    <xsl:template match="/">
       <xsl:for-each select="//sec:TypeCode">
            <xsl:value-of select="." />
       </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>