假设我有以下XML:
<Zoo>
<Keepers>
<Keeper name="Joe" manager="Miles" />
<Keeper name="Bob" manager="Karen"/>
</Keepers>
<Animals>
<Animal type="tiger" keeper="Joe"/>
<Animal type="lion" keeper="Joe"/>
<Animal type="giraffe" keeper="Bob"/>
</Animals>
</Zoo>
我基本上想要使用Keeper.name作为变量,然后将模板应用于匹配的Animal节点,其中Keeper.name = Animal.keeper。
这可以使用apply-templates或其他一些XSL语法吗?
在我的示例中,我想删除由Miles管理的所有Keepers并删除由Miles管理的守护程序保留的所有Animal节点,因此我将应用空白模板。
这是我的sudo XSL,它不太有效:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@manager='Miles']">
<xsl:apply-templates select="/Zoo/Animals/Animal[@keeper=current()/@name]"/>
<!-- apply a blank template to this Keeper -->
</xsl:template>
<xsl:template match="Animal">
<!-- apply a blank template to this Animal -->
</xsl:template>
我想要的输出XML如下:
<Zoo>
<Keepers>
<Keeper name="Bob" manager="Karen"/>
</Keepers>
<Animals>
<Animal type="giraffe" keeper="Bob"/>
</Animals>
</Zoo>
谢谢!
答案 0 :(得分:2)
如果列出了输入,请执行此操作:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="removeKeeper">Miles</xsl:param>
<xsl:template match="Keeper">
<xsl:if test="not(@manager=$removeKeeper)">
<Keeper>
<xsl:apply-templates select="@*"/>
</Keeper>
</xsl:if>
</xsl:template>
<xsl:template match="Animal">
<xsl:variable name="keeper" select="@keeper"/>
<xsl:if test="//Keepers/Keeper[@name=$keeper][not(@manager=$removeKeeper)]">
<Animal>
<xsl:apply-templates select="@*"/>
</Animal>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
产生此输出:
<Zoo>
<Keepers>
<Keeper name="Bob" manager="Karen"/>
</Keepers>
<Animals>
<Animal type="giraffe" keeper="Bob"/>
</Animals>
</Zoo>
您也可以使用:
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
而不是XSL中的显式Keeper和Animal标签。由你决定。