Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择具有xmlns的节点?_Xml_Xslt_Xhtml_Namespaces_Xml Namespaces - Fatal编程技术网

选择具有xmlns的节点?

选择具有xmlns的节点?,xml,xslt,xhtml,namespaces,xml-namespaces,Xml,Xslt,Xhtml,Namespaces,Xml Namespaces,我试图在xsl中选择xhtml文档中的所有链接。一些锚标记具有名称空间声明xmlns=”http://www.w3.org/1999/xhtml“在它们中。未选择这些选项。e、 g.使用此xml文档: <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="xsl.xsl"?> <root> <item> this iz sum text and it haz sum <a x

我试图在xsl中选择xhtml文档中的所有链接。一些锚标记具有名称空间声明
xmlns=”http://www.w3.org/1999/xhtml“
在它们中。未选择这些选项。e、 g.使用此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>

此iz sum文本和其中的haz sum。
dem中的linx haz PIK。
这个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>

仅选择第二个链接。有人能解释一下这里发生了什么以及我如何修复它吗?

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

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

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

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

....

元素位于两个不同的名称空间中,默认名称空间和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>

元素位于两个不同的名称空间中,默认名称空间和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>


这很有效-谢谢你。这里的问题是并非所有链接都用名称空间标记。在样式表标记中将默认名称空间设置为正确的名称空间(
xmlns=)http://www.w3.org/1999/xhtml“
)如果其他“匿名”节点也应位于该命名空间中,则应使
/root/item/a
选择所有项。最后一个命名空间声明可用于输出,而不是用于选择。XSLT2.0在这方面有一个
xpath默认名称空间
属性。@Alejandro:该死,你说得对,我没想清楚。如果所有节点都应该在同一个名称空间中,那么给OP的好建议是:遵循您的建议:)这很有效-谢谢。这里的问题是并非所有链接都用名称空间标记。在样式表标记中将默认名称空间设置为正确的名称空间(
xmlns=)http://www.w3.org/1999/xhtml“
)如果其他“匿名”节点也应位于该命名空间中,则应使
/root/item/a
选择所有项。最后一个命名空间声明可用于输出,而不是用于选择。XSLT2.0在这方面有一个
xpath默认名称空间
属性。@Alejandro:该死,你说得对,我没想清楚。如果所有节点都应该在同一名称空间中,那么给OP的好建议是遵循您的建议:)