0

我正在尝试转换一个包含单词列表的 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>

我正在尝试遵循我在这里找到的示例:

如何排除元素

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

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

蓝牙

4

2 回答 2

0

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

    <xsl:template match="nodeToMatch" />
于 2013-01-22T00:31:42.533 回答
0

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

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

然而,这有点像黑客。

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

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

这应该从输出中排除dic:author和。dic:title

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

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

这个模板实际上会做什么,如果它工作的话,将包括发送到它的方式的节点,但是一个模板不能同时具有一个match属性和一个name属性。我建议将您的 XSLT 重写为这样并从这里开始:

<!--Declare a parameter with the nodes to be removed-->
<xsl:template match="dic:author | dic:title" />

<!--create a template and call it remove node-->
<xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
</xsl:template>
于 2013-01-22T02:28:11.193 回答