【问题标题】:select a node with an xmlns?选择一个带有 xmlns 的节点?
【发布时间】:2010-10-04 20:24:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: xml xslt xhtml namespaces xml-namespaces


    【解决方案1】:

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

    /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">
    

    【讨论】:

    • 这行得通-谢谢。这里的问题是并非所有链接都标有名称空间。
    • 在样式表标签 (xmlns="http://www.w3.org/1999/xhtml") 中将默认命名空间设置为正确的命名空间应该可以使 /root/item/a 选择所有项目,如果其他“匿名”节点也应该在该命名空间中。
    • 最后一个命名空间声明对输出有用,而不是对选择有用。 XSLT 2.0 有一个 xpath-default-namespace 属性。
    • @Alejandro:该死的,你说得对,我没有想清楚。如果所有节点都应该在同一个命名空间中,那么对 OP 的好建议是遵循您的建议 :)
    【解决方案2】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 2014-10-10
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多