XSLT将文件读取到变量并删除XML中的相应值

时间:2015-12-07 17:28:05

标签: xml xslt xslt-1.0

我有一个xml:

<root>
    <tag1>
        <tag2 id="111" pid="000" name="name1">
            <tag3>xxx</tag3>
            ...more tags...
        </tag2>
        <tag2 id="222" nid="111" name="name2">
            <tag3>yyy</tag3>
            ...more tags...
        </tag2>
    </tag1>
    ...more tags...
</root>

带有名称值列表的txt文件(name.txt):

name1
name3
....

是否可以从name.txt读取xslt,删除name2,其名称属性与name.txt中的list匹配。所以xml的输出将是:

<root>
    <tag1>
        <tag2 id="222" nid="111" name="name2">
            <tag3>yyy</tag3>
            ...more tags...
        </tag2>
    </tag1>
    ...more tags...
</root>

干杯,李

2 个答案:

答案 0 :(得分:1)

我会用

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="text-url" select="'name.txt'"/>

<xsl:variable name="names" select="tokenize(unparsed-text($text-url), '\r?\n+')"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>


<xsl:template match="tag2[@name = $names]"/>

</xsl:stylesheet>

答案 1 :(得分:1)

如果您可以将外部文件修改为如下所示:

<强> names.xml

<names>
name1
name3
</names>

然后您可以使用以下样式表:

XSLT 1.0 + EXSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="names-doc" select="'names.xml'"/>
<xsl:variable name="names" select="str:tokenize(document($names-doc)/names, '&#10;')" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="tag2">
    <xsl:if test="not(@name = $names)">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

这需要一个支持EXSLT str:tokenize()函数的XSLT 1.0处理器,例如libxslt。