Java - 如何过滤XML文档并使用过滤后的数据创建新的XML

时间:2014-03-19 10:05:53

标签: xml xslt stax

我有以下输入文件,我想做的是适应REDCode,术语和名称等标准,我附加了样本输入和样本输出。

输入文件

<?xml version="1.0"?>
<data>

    <row>
        <Date>2013-01-07</Date>
        <Name>CDXNAIG</Name>
        <Series>3</Series>
        <Version>1</Version>
        <Term>10Y</Term>
        <REDCode>2I65BYAB1</REDCode>
        <IndexID>DJCDX-NAIGS3V1-10Y</IndexID>
        <Maturity>2015-03-20</Maturity>
        <OnTheRun>N</OnTheRun>
        <ModelPrice>0.9949284642210332</ModelPrice>
        <ModelSpread>0.009331104270305838</ModelSpread>
    </row>
    <row>
        <Date>2013-01-07</Date>
        <Name>CDXNAIGCONS</Name>
        <Series>3</Series>
        <Version>1</Version>
        <Term>10Y</Term>
        <REDCode>2I65B0AB5</REDCode>
        <IndexID>DJCDX-NAIGCONSS3V1-10Y</IndexID>
        <Maturity>2015-03-20</Maturity>
        <OnTheRun>N</OnTheRun>
        <ModelPrice>0.9840941282706241</ModelPrice>
        <ModelSpread>0.014379157758592408</ModelSpread>
    </row>
    <row>
        <Date>2013-01-07</Date>
        <Name>CDXEMexEU</Name>
        <Series>18</Series>
        <Version>1</Version>
        <Term>5Y</Term>
        <REDCode>1D765JAA2</REDCode>
        <IndexID>CDX-EM-EXEUS18V1-5Y</IndexID>
        <Maturity>2017-12-20</Maturity>
        <OnTheRun>Y</OnTheRun>
        <CompositePrice>1.1397499612219184</CompositePrice>
        <CompositeSpread>0.019792819070343613</CompositeSpread>
        <ModelPrice>1.1359120550302715</ModelPrice>
        <ModelSpread>0.020550114606075833</ModelSpread>
        <Depth>8</Depth>
        <Heat>0.2778164733341895</Heat>
    </row>
    <row>
        <Date>2013-01-07</Date>
        <Name>CDXEMexEU</Name>
        <Series>18</Series>
        <Version>1</Version>
        <Term>10Y</Term>
        <REDCode>1D765JAA2</REDCode>
        <IndexID>CDX-EM-EXEUS18V1-10Y</IndexID>
        <Maturity>2022-12-20</Maturity>
        <OnTheRun>Y</OnTheRun>
        <CompositePrice>1.2256727099999931</CompositePrice>
        <CompositeSpread>0.022458778204998295</CompositeSpread>
        <ModelPrice>1.2203158240779826</ModelPrice>
        <ModelSpread>0.02301955731474385</ModelSpread>
        <Depth>3</Depth>
        <Heat>0.280354127626739</Heat>
    </row>
</data>

应用过滤器后REDCode = 2I65BYAB1 OutPut应如下所示

<row>
    <Date>2013-01-07</Date>
    <Name>CDXNAIG</Name>
    <Series>3</Series>
    <Version>1</Version>
    <Term>10Y</Term>
    <REDCode>2I65BYAB1</REDCode>
    <IndexID>DJCDX-NAIGS3V1-10Y</IndexID>
    <Maturity>2015-03-20</Maturity>
    <OnTheRun>N</OnTheRun>
    <ModelPrice>0.9949284642210332</ModelPrice>
    <ModelSpread>0.009331104270305838</ModelSpread>
</row>

1 个答案:

答案 0 :(得分:2)

要在XSLT中获取匹配的节点或节点集,您必须根据输入(可能是发送到处理器的参数值)运行与您的条件匹配的模板。

例如,假设您使用Java运行XSLT处理器,您可以使用类似:

Source xslt = new StreamSource(new FileInputStream("stylesheet.xsl"));
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer(xslt);

Source input = new StreamSource(new FileInputStream("input.xml"));

public Result searchByRedCode(String redcode) { 
    Result result = new StreamResult(new FileOutputStream("result.xml"));
    t.setParameter("redcode", redcode); // this sends the parameter
    t.transform(input, result);
}

这会将您的结果放在result.xml

现在在样式表中,您应该声明一个全局参数:

<xsl:param name="redcode" />

然后,您可以使用XPath表达式检索与您的代码匹配的所有行:

//row[REDCode = $redcode]

此样式表将执行此操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:param name="redcode" />
    <xsl:template match="/">
        <xsl:apply-templates select="//row[REDCode = $redcode]" />
    </xsl:template>

    <xsl:template match="row">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

如果要添加搜索条件,则必须决定如何组合它们(AND,OR),然后您还可以使用参数将该信息发送到XSLT并使用更精细的XPath表达式来选择所需内容。