5

私はこのXMLファイルを持っています:

<?xml version="1.0"?>
<xi:include href="http://www.w3schools.com/dom/books.xml" 
            xmlns:xi="http://www.w3.org/2003/XInclude"/>

http://www.w3schools.com/dom/books.xmlそして、処理時 に参照されるリモートXMLファイルになるはずだと思っていました。

そのために、私はこのXSLファイルを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml"/>
    <xsl:template match="*">
        <xsl:copy-of select="//book/title"/>
    </xsl:template>
</xsl:stylesheet>

XSL変換後、参照されたXMLファイルからタイトルノードを含むXML出力を取得することを期待していました。

しかし、それは起こりませんでした。変換によって空のファイルが生成されました。XInclude指導が行われなかったのではないかと思います。

では、可能であれば、Xincluded XMLファイルにXSLTを適用するにはどうすればよいですか?

4

2 に答える 2

8

コメントの中で、OPは、さまざまなソースの場所にあるxmlドキュメントの画像を単一の出力ディレクトリにコピーする際に参照した回答のウォークスルーを要求しました。

このテンプレート。

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:document(@href)" />
</xsl:template>

...これらすべての要件を満たすxi:include要素に一致します。

  1. href属性があります
  2. (テキストドキュメントではなく)xmlドキュメントを参照します
  3. そして、そのドキュメントを見つけて開くことができます。

これらの条件が満たされたら、XMLドキュメントを開き、xi:includeノードではなく、ここにあるかのように処理します。

このテンプレート..。

<xsl:template match="xi:include[@href][@parse='text'][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:unparsed-text(@href,@encoding)" />
</xsl:template>

...純粋なテキストインクルードに対して同様のことを行います。@parseのデフォルト値は「xml」であることに注意してください。文字エンコードを変更することもできることに注意してください。メインドキュメントはUTF-8である可能性がありますが、含まれているドキュメントはたとえばUTF-16LEである可能性があります。

そして最後にこのテンプレート...

<xsl:template match="xi:include[@href][@parse=('text','xml') or not(@parse)][not(fn:unparsed-text-available(@href))][xi:fallback]">
 <xsl:apply-templates select="xi:fallback/text()" />
</xsl:template>

...ドキュメントを開くことができる場合(ファイル参照が壊れている可能性があります)を処理し、xi:includeノードはフォールバックコンテンツを提供します。

于 2012-07-18T02:08:11.820 に答える
0

XSD検証のようなXInclude処理は、要求した場合に発生するものであり、そうでない場合は発生しません。要求する方法は、使用している環境によって異なります。たとえば、XercesパーサーにはXInclude処理を実行するオプションがあります。

于 2012-07-17T16:33:55.267 に答える