我正在试图弄清楚如何根据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)。
我可以让一个国家去工作,但我并没有意识到如何强制模板匹配不同的属性。有什么想法吗?
答案 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>
说明:我们只输入包含有效Country
和State
组合的City
个元素;仅包含有效State
的{{1}}个元素;然后,只有有效的City
元素。所有无效或空的元素都被省略。