2010-04-06 185 views
4

这可能是一个非常简单的问题,但它的一个我似乎无法得到,正在撕裂我的头发。我有以下XML:XSL和命名空间

<?xml-stylesheet type="text/xsl" href="email.xsl"?> 
<Example xmlns=""> 
    <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> 
</Example> 

,我试图使用以下XSLT:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table width="90%" border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
      <td> 
       <p>AUTOMATED CONFIRMATION: This confirmation email is unable to take replies. For further assistance please visit our Help pages or Contact us</p> 
       <p>Dear <xsl:value-of select="Name"/>,</p> 
       <p>Thank you for blah blah... </p> 
      </td> 
      </tr> 
     </table> 
     <xsl:apply-templates/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

我不能让这个名字的时候,我使用了XML饲料中的xmlns=urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1出现,当我删除xmlns,名称显示正常。

是否有一些我失踪的语法?我尝试添加的命名空间的<xsl:stylesheet>元素:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rpg="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1" 
> 

然后用我给了XSLT的XPath表达式的前缀:

<xsl:value-of select="Name"/> 

但是,这也不行。谁能帮忙?提前致谢。

回答

0

或者使用谓词和局地名称()。例如:

<xsl:value-of select="*[local-name() = 'Name']"/> 
+0

这是一个坏主意,因为它不仅效率低下(因为字符串比较缓慢),而且也没有考虑它真正应该做的命名空间。 – Lucero 2010-04-06 17:33:57

+1

...如果名称空间相关(如果不同名称空间需要不同的行为)。如果XSL只是格式化您感兴趣的原始XML的内容,那么命名空间并不那么相关,并且可以忽略。在OP示例中,名称空间是* not *旨在保留在输出XML中,仅保留元素的文本内容。 我不确定对性能的关注。请记住,根据XPath函数定义“* [name()= name]”等同于“name”;无论如何,为了优化目的,编译器可以自由地将XPath表达式重写为等价的表达式。 – user268396 2010-04-06 18:33:07

+0

+1这不是一个坏的或错误的答案,值得一个负分。它有一些含义,但它们被命名。性能参数强烈依赖于当前节点有多少个子节点以及XSLT处理器如何优化。命名空间参数在很大程度上取决于您是否在意。 ;) – Tomalak 2010-04-07 17:26:42

4

您需要在XSLT中使用相同的名称空间,以便Name的XPath表达式匹配。

<xsl:value-of select="x:Name" xmlns:x="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1"/> 
+2

不幸的是,这么少的XSL教程示例包含名称空间,这是一个常见的混淆。如果有一个与元素相关联的名称空间,就XSL而言,它的名称是一个限定名称(http://en.wikipedia.org/wiki/QName),而不是简单名称。 – 2010-04-06 14:35:12

+0

这不是最好的方法,因为在'xsl:value-of'声明名称空间会不必要地膨胀XSL代码。在文档级声明它们是要走的路。 – Tomalak 2010-04-06 14:40:32

+0

@Tomalak,它取决于在哪个范围内使用名称空间。如果仅在此元素上使用它,则像这样使用它可清楚说明前缀所代表的名称空间。当然,如果命名空间要在几个地方使用,我也会将它移动到文档中。 – Lucero 2010-04-06 15:30:07

6

您的声明名称空间为<xsl:stylesheet>的方法已经是正确的方向。现在,所有你要做的就是使用前缀也:

<xsl:value-of select="Example/rpg:Name" /> 

我还建议一个微小的改变你的模板,以更好地反映您的输入:

<xsl:template match="Example"> 
    <!-- ... --> 
    <xsl:value-of select="rpg:Name" /> 
</xsl:template>