如何从XSLT获取未解析的实体属性的值?

时间:2009-01-22 10:13:38

标签: xml xslt dtd saxon xalan

我在XML中使用XSLT和未解析的实体时遇到问题。这是一个虚构的场景。首先,我得到了一个名为doc.xml的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)作为元素“employee”的属性“detail”。 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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

谢谢你,Dimitre Novatchev。根据你的回答,我在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))"/>