XSL - 无法将命名空间添加到根节点

时间:2011-05-19 07:43:22

标签: xslt html-agility-pack

我有一个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>

但命名空间不会出现在输出中。有什么不对吗?

2 个答案:

答案 0 :(得分:0)

我担心你想要创建的输出毫无意义!想想以下文档的含义:

<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命名空间中。

答案 1 :(得分:0)

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

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

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