我是一个XML文件,我想根据文本文件中的数据进行过滤
XML文件
<customers>
<customer id="1">
<name>Alfreds Futterkiste</name>
</customer>
<customer id="2">
<name>Ana Trujillo Emparedados y helados</name>
</customer>
<customer id="3">
<name>Antonio Moreno Taquería</name>
</customer>
</customers>
带键的文本文件
1
3
XSL现在apply-templates
应该@id='1' or @id='3'
喜欢
<xsl:apply-templates select=" customer-with-id-in-file " />
我如何表达customer-with-id-in-file
。可以使用XML东西包装密钥文件。
答案 0 :(得分:0)
不确定你的意思&#34; 可以用XML内容包装密钥文件&#34;?理想情况下,你会有类似的东西:
<customers>
<id>1</id>
<id>3</id>
</customers>
作为第二个文件。
如果那是不可能的,那么你所拥有的就是:
<强> file2.xml 强>
<xml>1
3</xml>
你可以这样做:
XSLT 1.0
(需要libxslt
或其他支持EXSLT str:tokenize()
功能的处理器)
<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="key-file" select="'file2.xml'"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/customers">
<xsl:copy>
<xsl:apply-templates select="customer[@id=str:tokenize(document($key-file)/xml, ' ')]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我可以完全控制输入文件。
那么你可以做到:
<xsl:template match="/customers">
<xsl:copy>
<xsl:apply-templates select="customer[@id=document($key-file)/customers/id]"/>
</xsl:copy>
</xsl:template>
假设您使用上面显示的结构。不需要扩展功能。