выбрать узел с xmlns? - PullRequest
       20

выбрать узел с xmlns?

0 голосов
/ 05 октября 2010

Я пытаюсь выбрать все ссылки в документе xhtml в xsl. Некоторые из тегов привязки имеют объявление пространства имен 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>

Выбрана только вторая ссылка. Может кто-нибудь объяснить, что здесь происходит и как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Если вам нужно оба узла, которые находятся в разных пространствах имен, используйте:

/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 голос
/ 05 октября 2010

Элементы 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>
...