Xml XSL和名称空间

Xml XSL和名称空间,xml,xslt,namespaces,Xml,Xslt,Namespaces,这可能是一个非常简单的问题,但这是一个我似乎无法理解的问题,我正在为此烦恼。我有以下XML: <?xml-stylesheet type="text/xsl" href="email.xsl"?> <Example xmlns=""> <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> </Example> 然后在

这可能是一个非常简单的问题,但这是一个我似乎无法理解的问题,我正在为此烦恼。我有以下XML:

<?xml-stylesheet type="text/xsl" href="email.xsl"?>
<Example xmlns="">
  <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name>
</Example>
然后在XPath表达式中使用我给XSLT的前缀:

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


但这也不行。有人能帮忙吗?提前感谢。

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

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

您在
中声明名称空间的方法已经是正确的方向。现在,您需要做的就是同时使用前缀:

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

我进一步建议您对模板进行细微更改,以更好地反映您的输入:

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

或者使用谓词和local-name()。例如:



不幸的是,XSL教程中很少有示例包含名称空间,这是一种常见的混淆。如果存在与元素关联的名称空间,就XSL而言,它的名称是限定名称(),而不是简单名称。这不是最好的方法,因为在
XSL:value的
处声明名称空间会不必要地膨胀XSL代码。在文档级别声明它们是一种方法。@Tomalak,这取决于名称空间在哪个范围内使用。如果只在这个元素上使用它,那么这样使用它可以清楚地知道前缀代表什么名称空间。当然,如果要在多个地方使用名称空间,我也会将其移动到文档中。这是一个坏主意,因为它不仅效率低下(因为字符串比较慢),而且还没有考虑名称空间,它确实应该这样做。。。。如果名称空间相关(如果不同的名称空间需要不同的行为)。如果XSL只是格式化您感兴趣的原始XML的内容,那么名称空间就不那么相关,可以忽略它。在OP示例中,名称空间不打算保留在输出XML中,只保留元素的文本内容。我不确定性能问题。请记住,根据XPath函数定义,“*[name()=name]”等同于“name”;无论如何,编译器可以自由地将XPath表达式“重写”为等效表达式以进行优化。+1这不是一个糟糕或错误的答案,应该得到负分。它有一些含义,但它们是被命名的。性能参数很大程度上取决于当前节点有多少子节点以及XSLT处理器的优化程度。名称空间参数很大程度上取决于您是否在意谢谢大家的帮助。我只是装傻,没有用化名。再次感谢!
<xsl:value-of select="Example/rpg:Name" />
<xsl:template match="Example">
  <!-- ... -->
  <xsl:value-of select="rpg:Name" />
</xsl:template>
<xsl:value-of select="*[local-name() = 'Name']"/>