【问题标题】:Java - how to filter XML document and create new XML with filtered dataJava - 如何过滤 XML 文档并使用过滤后的数据创建新的 XML
【发布时间】:2014-04-25 11:42:28
【问题描述】:

我有以下输入文件,我想做的是适应 REDCode、Term 和 Name 等标准,我附上了示例输入和示例输出。

输入文件

<?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 输出应如下所示

<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>

【问题讨论】:

  • 您要的是 Java 解决方案还是 XSLT 中的解决方案?
  • 可以有多个row 与目标REDCode 吗?如果是这样,那么如果您希望输出格式正确,则需要在所需输出周围添加一个根元素。

标签: xml xslt stax


【解决方案1】:

要在 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 表达式来选择您想要的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多