Как получить значение атрибута неразобранного объекта из XSLT? - PullRequest
3 голосов
/ 22 января 2009

У меня проблема с XSLT и неразобранной сущностью в XML. Вот вымышленный сценарий. Сначала я получил XML-файл с именем doc.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (lastname, firstname)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT firstname (#PCDATA)>
<!NOTATION FOO SYSTEM 'text/xml'>
<!ENTITY ATTACHMENT SYSTEM 'attach.xml' NDATA FOO>
<!ATTLIST employee
       detail ENTITY #IMPLIED>
]>
<document>
    <employee detail="ATTACHMENT">
        <lastname>Bob</lastname>
        <firstname>Kevin</firstname>
    </employee>
</document>

В этом XML-файле я использую неразобранную сущность (NDATA) для атрибута «detail» элемента «employee». Файл attach.xml:

<?xml version="1.0" encoding="UTF-8"?>

<name>Bob Kevin</name>

Тогда я хочу использовать XSLT для генерации вывода вместе со вложенным attach.xml. Мой XSLT-файл называется doc.xsl:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="document">
<Document>
        <xsl:apply-templates select="employee"/>
</Document>
</xsl:template>

<xsl:template match="employee">
Employee is:  <xsl:value-of select="@detail"/>
</xsl:template>

</xsl:stylesheet>

Наконец, я бегу, используя Xalan 2.7.1:

java -jar xalan.jar -IN doc.xml -XSL doc.xsl -OUT docout.xml

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<Document>
Employee is:  ATTACHMENT
</Document>

Это не то, что я хочу. Я хочу, чтобы результат выглядел так:

<?xml version="1.0" encoding="UTF-8"?>
<Document>
Employee is:  <name>Bob Kevin</name>
</Document>

Как мне переписать скрипт XSLT, чтобы получить правильный результат?

Ответы [ 2 ]

3 голосов
/ 22 января 2009

Решение в XSLT 2.0 :

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

<xsl:template match="document">
<Document>
        <xsl:apply-templates select="employee"/>
</Document>
</xsl:template>

<xsl:template match="employee">
Employee is:  <xsl:value-of select=
"unparsed-text(unparsed-entity-uri(@detail))"/>
</xsl:template>

</xsl:stylesheet>

Примечание следующее:

  1. Использование функций XSLT unparsed-text() и unparsed-entity-uri().

  2. Текст файла attach.xml будет экранирован в выводе . Если вы хотите увидеть его без экранирования, используйте атрибут "cdata-section-elements" в инструкции <xsl:output/>. *

1 голос
/ 23 января 2009

Спасибо, Дмитрий Новатчев. Согласно вашему ответу, я получил свой результат в XSLT 1.0. Для тех, кто может быть заинтересован, пожалуйста, обратитесь к http://www.xml.com/lpt/a/1243 для обсуждения. Вот мое решение:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="document">
<Document>
        <xsl:apply-templates select="employee"/>
</Document>
</xsl:template>

<xsl:template match="employee">
Employee is: <xsl:copy-of select="document(unparsed-entity-uri(@detail))"/>
</xsl:template>

</xsl:stylesheet>

Обратите внимание на следующую строку сверху:

 <xsl:copy-of select="document(unparsed-entity-uri(@detail))"/>
...