2

次のようなXMLファイルがあります。

<area1>
    <settings>
        <setting name="to_include">value</setting>
    </settings>
</area1>
<area2>
    <settings>
        <setting name="where_to_include">?????</setting>
    </settings>
</area2>

設定ノード「to_include」の値を設定ノード where_to_include」の値として含めたい。純粋な XML の方法で、どうすればよいでしょうか? XInclude? XPointer? XPath? XLink? 他の?

私はこのようなことができることを望みました:

<area2>
    <settings>
        <setting name="where_to_include">
            <xi:include href="SAMEFILE" xpointer="xpointer(/areas/area1/settings/setting[@name='debug'])">
                <xi:fallback>FALLBACK VALUE</xi:fallback>
        </setting>
    </settings>
</area2>

しかし、XIncludeを使用すると、ドキュメントの解析中にドキュメント自体を参照できません。

4

1 に答える 1

0

質問の意味がよくわかりませんが、言いたいことはなんとなくわかります。これはあなたが求めているものではないかもしれません。XPointer と XInclude について言及されていますが、これはやり過ぎのように思えます。

XSLT (1.0) ソリューションを次に示します。スタイルシートは、質問で指定したような XML ファイルを受け取りvalue?????. (ちなみに、あなたの XML にはラッパー要素が欠けているため、技術的には不正な形式です。しかし、私はあなたの言いたいことが理解できると思います。私は黙っareasてドキュメント要素として追加します。それが、次のスタイルシートがどのように機能するかです。実際に作業している XML に合わせて微調整する必要があります。)

スタイルシートは次のとおりです。

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

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

  <xsl:template match="*">
    <xsl:variable name="n" select="name (.)"/>
    <xsl:element name="{$n}">
      <xsl:for-each select="@*">
        <xsl:copy-of select="."/>
      </xsl:for-each>
      <xsl:apply-templates select="node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:element name="areas">
      <xsl:apply-templates select="areas"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="areas">
    <xsl:apply-templates select="area1"/>
    <xsl:apply-templates select="area2"/>
  </xsl:template>

  <xsl:template match="text()[parent::setting[ancestor::area2]]">
    <xsl:apply-templates select="preceding::area1/settings/setting/text()"/>
  </xsl:template>
</xsl:stylesheet>

スタイルシートは基本的に入力 XML ドキュメントをコピーするだけですが、ある時点を除きます。setting下の を処理する場合area2、テキストはコピーせず、area1ノードに戻ってその下のテキストをコピーしますsetting。xsltproc などの任意の XSLT プロセッサを使用して、これが機能することを確認できます (重要な XML 機能を自由に使用できるように思われるため、これは非常に簡単なはずです)。value変更した XML ドキュメントに対してスタイルシートをいくつか変更して実行するだけです。

于 2015-04-11T15:34:44.550 に答える