如何使用XSLT,只从输入xml中选择一些xml标签到输出XML? 示例输入:
<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="USA">
<State value="KY>
<City value="Hebron" />
</State>
<State value="OH">
<City value="Cincinnati" />
</State>
</Country>
答案 0 :(得分:2)
以下样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]" />
</xsl:stylesheet>
在此输入上:
<Country value="USA">
<State value="KY">
<City value="Hebron" />
<City value="Lexington" />
<City value="Owensboro" />
</State>
<State value="OH">
<City value="Cincinnati" />
<City value="Columbus" />
<City value="Cleveland" />
</State>
</Country>
产生以下结果:
<Country value="USA">
<State value="KY">
<City value="Hebron" />
</State>
<State value="OH">
<City value="Cincinnati" />
</State>
</Country>
此样式表使用identity transform将除了不需要的节点之外的所有节点复制到输出中。
另一个例子
您可能还想删除没有所需城市的任何State
元素。这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]"/>
<xsl:template
match="State[not(City[@value='Hebron' or @value='Cincinnati'])]"/>
</xsl:stylesheet>
应用于此输入:
<Country value="USA">
<State value="KY">
<City value="Hebron" />
<City value="Lexington" />
<City value="Owensboro" />
</State>
<State value="OH">
<City value="Cincinnati" />
<City value="Columbus" />
<City value="Cleveland" />
</State>
<State value="MO">
<City value="St. Louis" />
</State>
</Country>
产地:
<Country value="USA">
<State value="KY">
<City value="Hebron" />
</State>
<State value="OH">
<City value="Cincinnati" />
</State>
</Country>
答案 1 :(得分:1)
这只会留下特定的城市:
<xsl:template match="*|@*">
<xsl:copy><xsl:apply-templates select="*|@*"/></xsl:copy>
</xsl:template>
<xsl:template match="City[@value != 'Hebron' and @value != 'Cincinnati']"/>
这将只留下第一个城市:
<xsl:template match="*|@*">
<xsl:copy><xsl:apply-templates select="*|@*"/></xsl:copy>
</xsl:template>
<xsl:template match="City[position() > 1]"/>
答案 2 :(得分:1)
这是我的(可能不充分)2.0解决方案。城市是作为参数传递的正则表达式。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:param name="Cities" select="'Cincinnati|Hebron'"/>
<xsl:template match="State">
<xsl:if test="exists(City[matches(@value, $Cities)])">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="State/City">
<xsl:if test="matches(@value, $Cities)">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>