XSLT 将文件读取到变量并删除 XML 中的相应值
XSLT read file to variable and delete corresponding value in XML
我有一个 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,删除名称属性与 name.txt 中的列表匹配的 tag2。所以 xml 的输出将是:
<root>
<tag1>
<tag2 id="222" nid="111" name="name2">
<tag3>yyy</tag3>
...more tags...
</tag2>
</tag1>
...more tags...
</root>
干杯,李
我会用
<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>
如果你可以将外部文件修改成这样:
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, ' ')" />
<!-- 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。
我有一个 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,删除名称属性与 name.txt 中的列表匹配的 tag2。所以 xml 的输出将是:
<root>
<tag1>
<tag2 id="222" nid="111" name="name2">
<tag3>yyy</tag3>
...more tags...
</tag2>
</tag1>
...more tags...
</root>
干杯,李
我会用
<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>
如果你可以将外部文件修改成这样:
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, ' ')" />
<!-- 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。