使用`xsltproc`

时间:2015-09-07 10:03:09

标签: xml xslt

我是一个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东西包装密钥文件。

1 个答案:

答案 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, '&#10;')]"/>
    </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>

假设您使用上面显示的结构。不需要扩展功能。