XSL - Невозможно добавить пространство имен к корневому узлу - PullRequest
0 голосов
/ 19 мая 2011

У меня есть HTML, я хочу разобрать его в XML с помощью библиотеки html-agility-pack. Вот 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 голосов
/ 19 мая 2011

Вам необходимо добавить пространство имен в таблицу стилей

<?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 голосов
/ 19 мая 2011

Боюсь, что вывод, который вы пытаетесь создать, не имеет смысла!Подумайте о значении следующего документа:

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

Вы определяете префикс пространства имен «g» и сопоставляете его с URI http://myurl.com, однако ваш документ не содержит элементов, которые определены какнаходясь в этом пространстве имен!Вывод XSLT совершенно справедливо удаляет это избыточное объявление пространства имен.Вы хотели сделать это intead:

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

Это гарантирует, что BusinessDetail и все его дочерние элементы находятся в пространстве имен http://myurl.com.

...