XML上的xslt变量匹配

我试图弄清楚如何利用基于XML文档较低级别的属性的多个模板。例:
<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文档的实例,因为它将是Country = USA或Russia,但我不知道哪个。我想应用单个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与KY,Jonesville)。 我可以让一个国家去工作,但我并没有意识到如何强制模板匹配不同的属性。有任何想法吗?     
已邀请:
以下样式表执行一些基本验证/过滤:
<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>
说明:我们只输入包含有效
State
City
组合的
Country
元素;只有
State
元素包含有效的
City
;然后,只有有效的
City
元素。所有无效或空元素都被省略。     
根据您的评论,您的用户将通过某种参数标准指定所需的城市,我猜您会做类似以下的事情(请注意“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>
    

要回复问题请先登录注册