:xsltの動的xpath?私は、ファイルのセットをfollwingてい
SourceFile.xml:
<?xml version="1.0" encoding="utf-8" ?>
<Employees>
<Employee id="1">
<firstname relationship="headnote">Atif</firstname>
<lastname relationship="lname">Bashir</lastname>
<age relationship="age">32</age>
</Employee>
</Employees>
ParamerterSettings.xml
<?xml version="1.0" encoding="utf-8"?>
<Settings>
<Employee id="1">
<sourceFile>Lookup1.xml</sourceFile>
<sourceXpathfield>Employees/Employee[@id</sourceXpathfield>
<lookupXpathfield>Employees/Employee[@id='1']</lookupXpathfield>
<elementstoinsert>xyz</elementstoinsert>
</Employee>
</Settings>
Lookup.xml
<?xml version="1.0" encoding="utf-8"?>
<Employees>
<Employee id="1">
<department code="102">HR</department>
</Employee>
</Employees>
transform.xsl
を<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:include href="identity.xsl"/>
<xsl:param name="EmployeeId" select="'1,2'" />
<xsl:variable name="FileSettings" select="document('test3.xml')" />
<xsl:variable name="SuppressSetting" select="$FileSettings/Settings/Employee[@id = tokenize($EmployeeId, ',')]" />
<xsl:template match="Employee">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="publisher" />
<xsl:apply-templates select="node() except publisher"/>
<xsl:variable name="outerfile" select="document($SuppressSetting/sourceFile)"></xsl:variable>
<xsl:variable name="outerfiledetails" select="$outerfile/$SuppressSetting/lookupXpathfield"></xsl:variable>
<xsl:value-of select="$outerfiledetails"></xsl:value-of>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
出力は次のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<Employees>
<Employee id="1">
<firstname relationship="headnote">Atif</firstname>
<lastname relationship="lname">Bashir</lastname>
<age relationship="age">32</age>
HR
</Employee>
</Employees>
私はその後、私は私の出力を取得していますが、私はしたい
にTransform.xsl
に<xsl:variable name="outerfiledetails" select="$outerfile/$SuppressSetting/lookupXpathfield"></xsl:variable>
を以下の行を変更SourceFile.xml
とLookup.xml
の両方のXPathエクスプレッションをに維持するより一般的なスクリプトを書くことができます。動的なxpath以外の方法でこれを行うことはできますか?同じことを打ち明けるためのアイデアやヒントは非常に高く評価されます。
最初のほぼ怪しい質問を簡略化したのは良い進歩ですが、この質問は依然として複雑すぎてよく定義されていません。それを言い換えて、それをさらに簡素化してみてください - 私はあなたがすべての詳細を必要としないと確信しています。特に、2つ以上のファイルを扱う必要があるため、誰もがその質問を理解しようとしてもあきらめてしまいます。あまりに複雑すぎる:私はこのようにXSLTアプリケーションを設計することは決してないだろうと私は信じている。開発者の99%がXSLTを使っていると信じられない複雑な複雑なXSLTアプリケーションがある。 –
こんにちはDimitre、私が望むのは、外部ファイルからxpath値を実行することです。理由は、私は複数のexeternalファイルを持っているから、私はデータを取って元のソースファイルにそのデータを挿入したい。私は複数のテンプレートをハードコーディングすることでそれを行うことができますが、私はそれを避け、異なる結合やxpath値に基づいて複数のファイルから読み取る1つのテンプレートを外部ファイルの設定として定義します。 – atif
@ Nick-Jonesの答えは正しいです:これはXSLT/XPath 2.0ではできません。次のバージョンで提供されるかもしれません。しかし、私は動的なXPath評価の必要性を非常に疑っています。問題をうまく記述すると解決できない場合があります。単純な形式で質問してみてください。「このXML文書に含まれているこの式をどのように評価するのですか?」純粋なXSLTソリューションは不可能ですが、私がこの問題を知っている少なくとも3つの異なる "ハイブリッド"ソリューションがあります。 –