Заголовок XSLT 2.0 превращается в преобразованный XML - PullRequest
0 голосов
/ 30 марта 2012

Во-первых, заранее спасибо.Во-вторых, это мой первый пост, поэтому извиняюсь за любые ошибки или нарушения.

Я - нуб с xml и xslt, и не могу понять этоКогда я преобразовываю некоторый xml с помощью xslt 2.0, некоторые заголовки из xslt просачиваются в новый xml.Похоже, что это не так в xslt 1.0 (если xslt немного отличается).Вот xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xml_content>
<feed_name>feed</feed_name>
<feed_info>
    <entry_1>
        <id>1</id>
        <pub_date>1320814800</pub_date>
    </entry_1>
</feed_info>
</xml_content>

Вот xslt:

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output method="xml" indent="yes" />

<xsl:template match="xml_content">  
<Records>
    <xsl:for-each select="feed_info/entry_1">
        <Record>
            <ID><xsl:value-of select="id" /></ID>
            <PublicationDate><xsl:value-of select='xs:dateTime("1970-01-01T00:00:00") + xs:integer(pub_date) * xs:dayTimeDuration("PT1S")'/></PublicationDate>
        </Record>
    </xsl:for-each>
</Records>
</xsl:template>
</xsl:stylesheet>

Вот новый xml.Посмотрите конкретно на первый элемент «Записи».

<?xml version="1.0" encoding="UTF-8"?>
<Records xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns="http://www.w3.org/TR/xhtml1/strict">
         <Record>
             <ID>1</ID>
             <PublicationDate>2011-11-09T05:00:00</PublicationDate>
         </Record>
</Records>

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Хорошо, если вы вставите буквальные элементы результата, а xsl:stylesheet определяет пространство имен по умолчанию (например, xmlns="http://www.w3.org/TR/xhtml1/strict"), тогда это пространство имен применяется к этим элементам результата, и процессор XSLT правильно выдает это объявление пространства имен в корне результата.документ.Я уверен, что это происходит с XSLT 1.0 и 2.0.

Что касается xmlns:xs="http://www.w3.org/2001/XMLSchema", вы можете избавиться от этого, добавив exclude-result-prefixes="xs" к элементу xsl:stylesheet.

1 голос
/ 30 марта 2012

Он не протекает, он делает то, о чем вы его просили.

Каждый нефиксированный тег в файле XSL находится в пространстве имен http://www.w3.org/TR/xhtml1/strict (именно это означает привязка xmlns="...").Не забывайте, что XSL-файл по своей сути является XML-файлом и анализируется, как и любой другой XML-файл.

Но поскольку ваш XSL-шаблон объявляет, что эти теги должны быть помещены в вывод, ваш выводтеги тоже будут в том же пространстве имен.Опять же, это не должно удивлять, так как полное имя тега составлено из пространства имен и локального имени.

Таким образом, процессор XSLT должен связать это пространство имен с префиксом, чтобы получить правильныйвывод, и вот что вы видите здесь.(Он был привязан к пустому префиксу или пространству имен по умолчанию, но теоретически это мог быть любой другой префикс, вывод будет означать точно такой же.)

Решение состоит в том, чтобы просто удалить эту привязку пространства имен из вашегоXSL или измените его на любое пространство имен, в котором вы хотите, чтобы ваш вывод находился.

0 голосов
/ 30 марта 2012

Укажите желаемое пространство имен для элемента в вашем XSL, используя xsl: element: -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/TR/xhtml1/strict">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="xml_content">
        <xsl:element name="Records" namespace="Something">
            <xsl:for-each select="feed_info/entry_1">
                <Record>
                    <ID><xsl:value-of select="id" /></ID>
                    <PublicationDate><xsl:value-of select='xs:dateTime("1970-01-01T00:00:00") + xs:integer(pub_date) * xs:dayTimeDuration("PT1S")'/></PublicationDate>
                </Record>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Вы получите что-то вроде следующего: -

<?xml version="1.0" encoding="UTF-8"?>
<Records xmlns="Something">
   <Record xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.w3.org/TR/xhtml1/strict">
      <ID>1</ID>
      <PublicationDate>2011-11-09T05:00:00</PublicationDate>
   </Record>
</Records>

Сделайте то же самое для "Record", "ID" и "PublicationDate", и вы будете отсортированы.

...