排除xslt不起作用的元素

时间:2013-01-22 00:27:02

标签: xslt

我正在尝试转换包含单词列表的xml文件,我试图从结果文档中排除某些元素,更具体地说,

我的清单如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="merge.xsl"?>

    <dic:englishWords xmlns:dic = "dictionary">
        <dic:words>
                <dic:englishWords xmlns:dic = "dictionary">
    <dic:title>
    English Dictionary
    </dic:title>
    <dic:author>
        <dic:authorsName>
            Author:
        <dic:name>
            User
        </dic:name>
        <dic:lastName>
            Name
        </dic:lastName> 
        </dic:authorsName>
    </dic:author>
    <dic:words>
            <dic:name>Water</dic:name><br/>
            <dic:name>Room</dic:name><br/>
            <dic:name>Computer</dic:name><br/>
            <dic:name>Book</dic:name><br/>
            <dic:name>Garage</dic:name><br/>
            <dic:name>Car</dic:name><br/>
            <dic:name>Ship</dic:name><br/>
            <dic:name>Food</dic:name><br/>
            <dic:name>Coffee</dic:name><br/>
            <dic:name>Program</dic:name><br/>
    </dic:words>
</dic:englishWords>

单词列表的路径包含在xml文件中,如下所示:

<dic:dictionary xmlns:dic = "dictionary">
    <dic:Logo>Logo</dic:Logo>
    <dic:Author>User Name</dic:Author>
    <dic:EnglishWords>english</dic:EnglishWords>
    <dic:SwedishTranslation>swedish</dic:SwedishTranslation>
    <dic:SwedishWords>swedish</dic:SwedishWords>
    <dic:EnglishTranslation>english</dic:EnglishTranslation>
</dic:dictionary>

我的转型如下

    <!--Declare a parameter with the nodes to be removed-->
   <xsl:param name="removeElementsNamed" select="'|dic:author|dic:title'"/>

    <!--create a template and call it remove node-->
    <xsl:template match="node()|@*" name="removeNode">
          <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
          </xsl:copy>
    </xsl:template>

    <!--remove the actual nodes-->
    <xsl:template match="*">
          <xsl:if test="not(contains($removeElementsNamed, concat('|',name(),'|')))">
            <xsl:call-template name="removeNode"/>
          </xsl:if>
    </xsl:template>

我试图效仿我在这里找到的一个例子:

how to exclude elements

...但在我的情况下,它不起作用。

任何帮助将不胜感激......

Bluetxxth

2 个答案:

答案 0 :(得分:0)

您可以匹配您不想要但不输出任何内容的元素。

    <xsl:template match="nodeToMatch" />

答案 1 :(得分:0)

因此,您似乎试图根据$ removeElementsNamed中是否存在|ELEMENTNAME|来排除元素,但dic:author是该列表中唯一具有双方管道的项目。如果你这样做,它几乎可以工作:

<xsl:param name="removeElementsNamed" select="'|dic:author|dic:title|'"/>

然而,这有点像黑客。

更好的方法是做这样的事情:

<xsl:template match="dic:author | dic:title" />

这应该从输出中排除dic:authordic:title

另一个问题是此模板名称错误:

<xsl:template match="node()|@*" name="removeNode"> 

这个模板实际上会做什么,如果它起作用,将是包含以其方式发送的节点,但模板不能同时具有match属性和{ {1}}属性。我建议重写你的XSLT,并从这里开始:

name