xslt变量匹配XML

时间:2011-04-08 17:24:39

标签: xml xslt match

我正在试图弄清楚如何根据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,但我不知道哪个。我想应用一个允许Country的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)。

我可以让一个国家去工作,但我并没有意识到如何强制模板匹配不同的属性。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

根据您的评论,您的用户将通过某种参数标准指定所需的城市,我猜您会做类似以下的事情(请注意“SATISFIES CRITERIA”伪代码,因为我不知道具体的标准是什么city @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>

答案 1 :(得分: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>

说明:我们只输入包含有效CountryState组合的City个元素;仅包含有效State的{​​{1}}个元素;然后,只有有效的City元素。所有无效或空的元素都被省略。