我(非常)是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>
提前致谢!
答案 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>