3

XSLT と XML の未解析エンティティに問題があります。これは架空のシナリオです。最初に、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 ファイルでは、要素「employee」の属性「detail」に未解析エンティティ (NDATA) を使用しています。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 スクリプトをどのように書き直す必要がありますか?

4

2 に答える 2

1

ありがとう、ディミトレ・ノヴァチェフ。あなたの答えによると、私は 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))"/>
于 2009-01-23T03:16:37.397 に答える