xslt中匹配命名空间的问题

时间:2011-06-10 16:00:38

标签: xslt namespaces

具有特定节点的匹配元素存在问题。

xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" herf="B1.xsl"?>
<profile xmlns:base = "urn:mytest:baseInfo"
xmlns:prf="http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#">
    <base:Description>
        <base:text>description of profile</base:text>
    </base:Description>
    <prf:Component>
        <prf:Keyboard>PhoneKeyPad</prf:Keyboard>
        <prf:Model>SampleModel</prf:Model>
        <prf:NumberOfSoftKeys>3</prf:NumberOfSoftKeys>
        <prf:PixelAspectRatio>1x1</prf:PixelAspectRatio>
        <prf:ScreenSize>128x240</prf:ScreenSize>
    </prf:Component>
</profile>

并且XSLT是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:base = "urn:mytest:baseInfo" xmlns:prf="http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#">
<xsl:output method="xml" indent="yes"/>


<xsl:template match="prf:*">
    <xsl:variable name="temp">
        <xsl:value-of select="local-name(.)"/>
    </xsl:variable>

    <xsl:element name="{$temp}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

结果是:

<?xml version="1.0" encoding="UTF-8"?>description of profile<Component>
    <Keyboard>PhoneKeyPad</Keyboard>
    <Model>SampleModel</Model>
    <NumberOfSoftKeys>3</NumberOfSoftKeys>
    <PixelAspectRatio>1x1</PixelAspectRatio>
    <ScreenSize>128x240</ScreenSize>
</Component>

为什么还会输出“个人资料描述”?它有“基础”命名空间。

提前致谢。

1 个答案:

答案 0 :(得分:3)

简单的答案是:因为你永远不会告诉XSLT处理器忽略它。

您提供了一个处理prf:*的模板,但您并未禁止base:的处理。除此之外,XSLT处理器将默认行为built-in rules,还有here)应用于它遇到的任何未由任何自定义模板处理的节点。

元素节点的默认行为是:

  • 将他们的文本节点子节点复制到输出
  • 处理他们的子元素

了解到,您的<base:Description><base:Text>元素完全符合您的要求。要防止它,请使用空模板捕获它们:

<xsl:template match="base:*" /> 

或通过为根节点定义模板来手动指导程序流:

<xsl:template match="/">
  <xsl:apply-templates select="profile/prf:Component" />
</xsl:template>