【问题标题】:XSL - Cannot add a namespace to the root nodeXSL - 无法将命名空间添加到根节点
【发布时间】:2011-05-19 07:43:22
【问题描述】:

我有一个 html,我想使用 html-agility-pack 库将其解析为 xml。这是 xsl:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:template match="/">
    <BusinessDetail>
      <Name>
        <xsl:value-of select="//span[@class='pp-place-title']/span" />
      </Name>
      <Address>
        <xsl:value-of select="//span[@class='pp-headline-item pp-headline-address']/span"/>
      </Address>
      ...
    </BusinessDetail>
  </xsl:template>
</xsl:stylesheet>

我只想给根节点添加一个命名空间。预期的输出是:

<BusinessDetail xmlns:g="http://myurl.com">
  <Name>
    ...
  </Name>
  ..
</BusinessDetail>

所以将我的 xls 更改为:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:template match="/">
    <BusinessDetail xmlns:g="http://myurl.com">
      <Name>
        <xsl:value-of select="//span[@class='pp-place-title']/span" />
      </Name>
      <Address>
        <xsl:value-of select="//span[@class='pp-headline-item pp-headline-address']/span"/>
      </Address>
      ...
    </BusinessDetail>
  </xsl:template>
</xsl:stylesheet>

但是命名空间没有出现在输出中。有什么问题吗?

【问题讨论】:

    标签: xslt html-agility-pack


    【解决方案1】:

    恐怕您尝试创建的输出没有意义!思考以下文档的含义:

    <BusinessDetail xmlns:g="http://myurl.com">
      <Name>
        ...
      </Name>
      ..
    </BusinessDetail>
    

    您正在定义命名空间前缀“g”并将其映射到 URI http://myurl.com,但是,您的文档不包含任何定义为位于此命名空间内的元素! XSLT 的输出完全正确地剥离了这个冗余的名称空间声明。您是否打算这样做:

    <BusinessDetail xmlns="http://myurl.com">
      <Name>
        ...
      </Name>
      ..
    </BusinessDetail>
    

    这确保BusinessDetail 及其所有子元素都在http://myurl.com 命名空间中。

    【讨论】:

      【解决方案2】:

      您需要将命名空间添加到样式表中

      <?xml version="1.0" encoding="utf-8" ?>
      <xsl:stylesheet version="2.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:g="http://myurl.com">
        <xsl:template match="/">
          <BusinessDetail>
            <Name>
              <xsl:value-of select="//span[@class='pp-place-title']/span" />
            </Name>
            <Address>
              <xsl:value-of select="//span[@class='pp-headline-item pp-headline-address']/span"/>
            </Address>
            ...
          </BusinessDetail>
        </xsl:template>
      </xsl:stylesheet>
      

      但是,除非您指定使用该命名空间的任何节点(您的示例没有,除了定义它)它不会显示在输出中。

      【讨论】:

      • 嗨 - 我不同意,您不必将命名空间添加到 xsl:stylesheet 元素,它可以出现在文档中的任何位置。但是是的,你是对的,除非它被使用,否则它不会出现在输出中!
      • @ColinE 也许这对我来说是不好的措辞,并通过一个强化该特定案例的示例来强化。至少我没有使用包含命名空间别名的初稿:)
      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2014-09-08
      • 2018-10-12
      • 1970-01-01
      相关资源
      最近更新 更多