2011-04-08 56 views
0

我想弄清楚如何在XML文檔的較低級別基於屬性來利用多個模板。例如:XML上的xslt變量匹配

<World> 
<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron"/> 
     <City value="Lexington"/> 
     <City value="Owensboro"/> 
     <City value="Jonesville"/> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati"/> 
     <City value="Columbus"/> 
     <City value="Cleveland"/> 
     <City value="Jonesville"/> 
    </State> 
    <State value="IN"> 
     <City value="Indianapolis"/> 
    </State> 
</Country> 
</World> 
<World> 
<Country value="Russia"> 
    <State value="Estonia"> 
     <City value="Tallinn"/> 
     <City value="Dorpat"/> 
     <City value="Owensboro"/> 
    </State> 
    <State value="Ukraine"> 
     <City value="Kiev"/> 
     <City value="Sevastopol"/> 
     <City value="Slavutych"/> 
     <City value="Jonesville"/> 
    </State> 
</Country> 
</World> 

我要接收XML文檔的情況下,因爲這將任何一個國家=美國或俄羅斯,但我不知道是哪個。我想申請一個單一的XSLT,這個XSLT將允許任何一個國家和不同的城市作爲結果。

如果美國爲例,輸出看起來像:

<World> 
<Country value="USA"> 
<State value="KY"> 
    <City value="Hebron" /> 
</State> 
<State value="OH"> 
     <City value="Cincinnati" /> 
     <City value="Jonesville" /> 
</State> 
</Country> 
</World> 

如果俄羅斯:

<World> 
<Country value="Russia"> 
<State value="Estonia"> 
    <City value="Dorpat" /> 
    <City value="Owensboro" /> 
</State> 
<State value="Ukraine"> 
     <City value="Keiv" /> 
     <City value="Sevastopol" /> 
     <City value="Slavutych" /> 
</State> 
</Country> 
</World> 

還要注意,有可能希望一個城市在一個國家而不是另狀態(即OH vs KY,Jonesville)。

我可以讓一個國家的工作,但我不掌握如何強制模板匹配不同attibutes。有任何想法嗎?

+0

這裏很難確切地說出你要找的是什麼。你想要在選擇城市複製到你的輸出時應用哪些標準? – Jollymorphic 2011-04-08 17:31:44

+0

它將通過XSLT中的一組參數進行定義。每個客戶可能會進入並將其改爲其他城市價值。 – 2011-04-08 17:44:52

+0

@Matt答:完整的答案取決於你用於這個過濾的數據。另一方面,就像你以前的[問題]一樣(http://stackoverflow.com/questions/5585372/use-xslt-to-pare-down-xml-output)。 – 2011-04-08 19:02:45

回答

0

以下樣式表執行一些基本的驗證/過濾:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:my="my"> 
    <my:vals> 
     <v v="USA|KY|Hebron" /> 
     <v v="USA|OH|Cincinnati" /> 
     <v v="USA|OH|Jonesville" /> 
     <v v="Russia|Estonia|Dorpat" /> 
     <v v="Russia|Estonia|Owensboro" /> 
     <v v="Russia|Ukraine|Kiev" /> 
     <v v="Russia|Ukraine|Sevastopol" /> 
     <v v="Russia|Ukraine|Slavutych" /> 
    </my:vals> 
    <xsl:variable name="vals" select="document('')/*/my:vals/*" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="World"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|Country[State/City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]]" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Country"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|State[City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]]" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="State"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

在此輸入:

<World> 
    <Country value="USA"> 
     <State value="KY"> 
      <City value="Hebron" /> 
      <City value="Lexington" /> 
      <City value="Owensboro" /> 
      <City value="Jonesville" /> 
     </State> 
     <State value="OH"> 
      <City value="Cincinnati" /> 
      <City value="Columbus" /> 
      <City value="Cleveland" /> 
      <City value="Jonesville" /> 
     </State> 
     <State value="IN"> 
      <City value="Indianapolis" /> 
     </State> 
    </Country> 
    <Country value="Russia"> 
     <State value="Estonia"> 
      <City value="Tallinn" /> 
      <City value="Dorpat" /> 
      <City value="Owensboro" /> 
     </State> 
     <State value="Ukraine"> 
      <City value="Kiev" /> 
      <City value="Sevastopol" /> 
      <City value="Slavutych" /> 
      <City value="Jonesville" /> 
     </State> 
    </Country> 
</World> 

產地:

<World> 
    <Country value="USA"> 
     <State value="KY"> 
      <City value="Hebron" /> 
     </State> 
     <State value="OH"> 
      <City value="Cincinnati" /> 
      <City value="Jonesville" /> 
     </State> 
    </Country> 
    <Country value="Russia"> 
     <State value="Estonia"> 
      <City value="Dorpat" /> 
      <City value="Owensboro" /> 
     </State> 
     <State value="Ukraine"> 
      <City value="Kiev" /> 
      <City value="Sevastopol" /> 
      <City value="Slavutych" /> 
     </State> 
    </Country> 
</World> 

說明:我們只輸入包含有效StateCity組合Country元素;只有包含有效CityState元素;然後,只有有效的City元素。所有無效或空的元素都被刪除。

+0

+1正確答案。我喜歡固定路徑,但爲了簡單起見,您可以使用''。只複製具有符合標準的「城市」後代的元素。 – 2011-04-09 13:28:39

0

根據你的評論,你的用戶將通過某種參數標準指定所需的城市,我想你會做類似下面的事情(注意「SATISFIES CRITERIA」僞代碼,因爲我不知道準確的標準@value需要滿足一個地點):

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <template match="/World"> 
     <copy> 
     <apply-templates select="Country[ State/City[ @value SATISFIES CRITERIA ] ]" /> 
     </copy> 
    </template> 

    <template match="Country|State|@*"> 
     <copy> 
     <apply-templates select="*|@*" /> 
     </copy> 
    </template> 

    <template match="City[ @value SATISFIES CRITERIA ]"> 
     <copy> 
     <apply-templates select="@*" /> 
     </copy> 
    </template> 
</stylesheet>