XSLT有条件地写入两个不同的文件

时间:2011-03-07 20:58:09

标签: xslt-2.0

我需要从XML文件中提取日志消息并将其写入纯文本文件。日志消息有两种形式,我想将它们写入单独的文件中。

我编写了一个完全符合我需要的样式表,除了它有时会创建空文件,因为XML文件可能不包含某种类型的消息。

我想知道,1)如果我做的是最好的方法,2)如果有办法压制空文件。

我的示例可能包含错误,因为它已重新输入。 (原文在封闭的网络上)

注意:我正在使用XSLT 2.0功能。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="text" encoding="iso-8859-1" />

<xsl:param name="break" select="string('&#xA;')" />

<xs:template match="/">

    <xsl:result-document method="text" href="foo.txt">
        <xsl:apply-templates select="Root/a/b/c[contains(., 'foo')]" />
    </xsl:reult-document>

    <xsl:result-document method="text" href="bar.txt">
        <xsl:apply-templates select="Root/a/b/c[not(contains(., 'foo'))]" />
    </xsl:reult-document>

</xsl:template>

<xsl:template match="*">
    <xsl:value-of select=concat(normalize-space(.), $break)" />
</xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

你可以使用一些XSLT 2.0样式表,如:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="break" select="string('&#xA;')" />
    <xsl:template match="/">
        <xsl:apply-templates select="Root/a/b/c"/>
    </xsl:template>
    <xsl:template match="/Root/a/b/c[contains(., 'foo')]">
        <xsl:result-document method="text" href="foo.txt">
            <xsl:next-match/>
        </xsl:result-document>
    </xsl:template>
    <xsl:template match="/Root/a/b/c[not(contains(., 'foo'))]">
        <xsl:result-document method="text" href="bar.txt">
            <xsl:next-match/>
        </xsl:result-document>
    </xsl:template>
    <xsl:template match="*">
        <xsl:value-of select="concat(normalize-space(.), $break)" />
    </xsl:template>
</xsl:stylesheet>

注意:模式匹配和xsl:next-match