質問の意味がよくわかりませんが、言いたいことはなんとなくわかります。これはあなたが求めているものではないかもしれません。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 ドキュメントに対してスタイルシートをいくつか変更して実行するだけです。