选择一个带有xmlns的节点?

时间:2010-10-04 20:24:53

标签: xml xslt xhtml namespaces xml-namespaces

我正在尝试选择xsl中xhtml文档中的所有链接。一些锚标记中包含名称空间声明xmlns="http://www.w3.org/1999/xhtml"。这些都没有被选中。例如使用此xml doc:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?>
<root>
<item>
this iz sum text and it haz sum <a xmlns="http://www.w3.org/1999/xhtml" href="http://cheezburger.com/">linx</a> in it.
Teh linx haz piks of <a href="http://icanhascheezburger.com/">kittehs</a> in dem.
</item>
</root>

和这个xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<dl>
<xsl:for-each select="//root/item/a">
    <dd><xsl:value-of select="."/></dd>
    <dt><xsl:value-of select="@href"/></dt>
</xsl:for-each>
</dl>
</html>
</xsl:template>
</xsl:stylesheet>

仅选择第二个链接。有人可以解释这里发生了什么,以及我如何解决它?

2 个答案:

答案 0 :(得分:2)

如果您需要两个节点(位于不同的命名空间中),请使用:

/root/item/*[local-name() = 'a']

但是,这种情况很少发生,通常,您只需要一个名称空间的节点:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:example="http://www.w3.org/1999/xhtml"
  >
....
<xsl:for-each select="/root/item/example:a">

答案 1 :(得分:1)

a个元素位于2个不同的名称空间中,默认名称空间和xhtml名称空间。如果将XPath移到xhtml格式之外,则可以使用两个命名空间进行搜索:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <xsl:variable name="links" xmlns:xhtml="http://www.w3.org/1999/xhtml"
                  select="//root/item/(a | xhtml:a)"/>

    <html xmlns="http://www.w3.org/1999/xhtml">
      <dl>
        <xsl:for-each select="$links">
          <dd><xsl:value-of select="."/></dd>
          <dt><xsl:value-of select="@href"/></dt>
        </xsl:for-each>
      </dl>
    </html>
  </xsl:template>

</xsl:stylesheet>