1

这是我的示例文档

<a >
 <b flag='foo'>
 <c/>
 <d/>
 </b>
</a>

仅当 b 上的标志属性为“bar”时,我才希望删除“c”元素。即如果 flag='foo' 则不应删除“c”元素。我的电脑上目前没有 xsl 调试工具,也找不到显示 xslt 错误信息的在线工具,并且一直在http://xslttest.appspot.com/上运行以下测试 xsl 转换:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
<xsl:output method="xml" indent="yes" version="1.0" encoding="ISO-8859-1"/>
    <!--Identity template to copy all content by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:choose>
    <xsl:when test="/a/b[@flag='bar']">
    <xsl:template match="/a/b/c"/>
    </xsl:when>
    </xsl:choose>
</xsl:stylesheet>

当我运行它时,我得到错误:无法编译样式表。检测到 3 个错误。我正在寻求帮助 (1) 解决 xsl 代码的问题和 (2) 任何可以调试/测试 xsl 代码片段的 xsl jsfiddle 之类的东西。

4

1 回答 1

4

你不能把 a 放在choose外面template,但你不需要 - 你可以在匹配表达式中使用谓词,所以只需声明你的无操作模板来匹配你想要删除的元素:

<xsl:template match="b[@flag='bar']/c" />

或更一般地,如果元素的父c元素可能有不同的名称

<xsl:template match="c[../@flag='bar']" />

或者

<xsl:template match="*[@flag='bar']/c" />
于 2012-12-20T18:13:25.960 回答