2011-05-19 61 views
0

我有一个html,我想使用html-agility-pack库将它解析为xml。这里的xsl: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> 

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

回答

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

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> 

但是,除非你指定使用该命名空间的任何节点(例如你不超出其定义),它不会出现在输出。

+0

嗨 - 我不同意,您不必将名称空间添加到xsl:stylesheet元素,它可以出现在文档中的任何位置。但是,是的,你是对的,除非它被使用,它不会出现在输出中! – ColinE 2011-05-19 07:58:35

+0

@ColinE也许这是我的错误措辞,加强了一个例子,加强了具体的情况。至少我没有参加我的初稿,包括命名空间别名:) – 2011-05-19 08:50:15