我已經follwing文件集:xslt中的動態xpath?
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表達式保留爲ParamerterSettings.xml
,以便我可以編寫更通用的腳本。這可以通過任何其他方式完成,然後動態xpath?任何想法或暗示推動相同將高度讚賞。
這是你已經簡化您最初的幾乎可怕的問題了良好的進展,但這個問題仍然過於複雜和不明確。嘗試改變它並進一步簡化它 - 我相信你不需要所有的細節。尤其是,如果要處理兩個以上的文件,每個人都會放棄嘗試理解問題。太複雜了:我永遠不會用這種方式設計XSLT應用程序,並相信我,我有XSLT應用程序的複雜性非常具有挑戰性,99%的開發人員不相信XSLT可能會這樣做。 – 2011-01-07 20:58:20
嗨Dimitre,我想要的是從外部文件執行xpath值。原因是我有多個exeternal文件,我想從中獲取數據並將該數據插回到主源文件中。我可以通過對多個模板進行硬編碼來實現,但我想避免這種情況,並根據不同的連接或xpath值將多個文件中的一個模板定義爲外部文件中的設置。 – atif 2011-01-08 02:26:49
@ Nick-Jones的答案是正確的:這不能在XSLT/XPath 2.0中完成,它可能由下一個版本提供。但是,我非常懷疑動態XPath評估的必要性 - 如果您很好地描述了您的問題,那麼可能有一個解決方案不需要這樣做。爲什麼不直接以最簡單的形式提出問題:「我如何評估此XML文檔中包含的這個表達式?」。雖然純粹的XSLT解決方案是不可能的,但至少有三種不同的「混合」解決方案,我知道這個問題。 – 2011-01-10 14:18:30