преобразование xslt, возвращающее пустые значения - PullRequest
2 голосов
/ 21 февраля 2011

Я только вхожу в преобразование xslt, и после прохождения учебника я попытался сделать некоторый код в Visual Studio 2008. Я попробовал следующий код после связывания документа XML, который мне был нужен в качестве ввода:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
  <xsl:copy>
    <xsl:element name="entry">
     <xsl:attribute name="published" >
      <xsl:value-of select="entry/published"/>
    </xsl:attribute>
    <xsl:attribute name="title" >
      <xsl:value-of select="title"/>
    </xsl:attribute>
    <xsl:attribute name="summary" >
      <xsl:value-of select="summary"/>
    </xsl:attribute>
     </xsl:element>
   </xsl:copy>
 </xsl:template>

Вот пример XML-файла:

<entry xmlns:gnip="http://www.p.com/schemas/2010" xmlns="http://www.w3.org/2005/Atom">
<id>tag:search,2005:38587000730689536</id>
<published>2011-02-18T13:13:52Z</published>
<updated>2011-02-18T13:13:52Z</updated>
<title>nachopego (J Ignacio Pe&#xF1;a G.) posted a note</title>
<summary type="html">Truculencia: en Nayarit no nada mas
     el engrudo se hace  bolas</summary>
<category term="StatusPosted" label="Status Posted"/>
 <category term="NotePosted" label="Note Posted"/>
 <link rel="alternate" 
       type="text/html"  href="http://nachopego/statuses/38587000730689536"/>

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Это наиболее часто задаваемые вопросы в тегах xpath и xslt : выражения XPath для документа XML с пространством имен по умолчанию.

Просто найдите «пространство имен по умолчанию xpath», и вы найдете много хороших ответов.

Решение :

  1. Добавьте объявление пространства имен в таблицу стилей XSLT для пространства имен по умолчанию документа XML.Используйте префикс (скажем) «x:» в этом объявлении.

  2. В любом выражении XPath, которое ссылается на элемент по имени, добавьте к каждому имени префикс «x:» префикс.

Ваш код становится :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.w3.org/2005/Atom" >
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:copy>
            <xsl:element name="entry">
                <xsl:attribute name="published" >
                    <xsl:value-of select="x:entry/x:published"/>
                </xsl:attribute>
                <xsl:attribute name="title" >
                    <xsl:value-of select="x:title"/>
                </xsl:attribute>
                <xsl:attribute name="summary" >
                    <xsl:value-of select="x:summary"/>
                </xsl:attribute>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

, и теперь он производит некоторый вывод.

Объяснение :

Xpath всегда обрабатывает имена без префиксов как принадлежащие "no namespace".Таким образом, если выражение содержит имя someName, XPath пытается найти элемент с именем someName, который принадлежит «без пространства имен» и терпит неудачу, поскольку все элементы в документе принадлежат его непустому пространству имен по умолчанию.

Решение (как указано выше) - это для ссылки на имена с использованием префиксного имени , где префикс привязан точно кпространство имен по умолчанию для документа XML.

1 голос
/ 21 февраля 2011

Кстати, этот код

     <xsl:element name="entry">
        <xsl:attribute name="published" >
            <xsl:value-of select="x:entry/x:published"/>
        </xsl:attribute>
        <xsl:attribute name="title" >
            <xsl:value-of select="x:title"/>
        </xsl:attribute>
        <xsl:attribute name="summary" >
            <xsl:value-of select="x:summary"/>
        </xsl:attribute>
    </xsl:element>

можно записать гораздо более разборчиво, как

<entry published="{x:entry/x:published}" 
       title="{x:title}" 
       summary="{x:summary}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...