2011-06-10 121 views
0

匹配具有特定节点的元素是一个问题。xslt中匹配命名空间的问题

的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> 

为什么 “配置文件的说明” 也输出?它有“基础”命名空间。

在此先感谢。

回答

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>