java - 需要帮助从 xml 递归获取数据

标签 java xml xslt

我正在尝试通过 XSLT 递归地从以下 xml 属性中读取数据。

这是我的示例 XML 数据!!

<FIXML .....">
  <Batch ....>
    <MktDef MktID="XEUR" MktSegID="14" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="CONF" MarketSegmentDesc="FUT 8-13 Y. SWISS GOV.BONDS 6%" Sym="CH0002741988" ParentMktSegmID="FBND" Ccy="CHF" MktSegStat="1" USFirmFlag="Y" PartID="2">
     .
     .
     .
    </MktDef>
    <MktDef MktID="XEUR" MktSegID="19629" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="FBON" MarketSegmentDesc="EURO BONO FUTURE 8,5-10,5 YEAR" Sym="DE000A163W29" ParentMktSegmID="FBND" Ccy="EUR" MktSegStat="1" USFirmFlag="Y" PartID="2">
     .
     .
     .
     </MktDef>
     .
     .
     .

这是我的 XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
 MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID
<xsl:for-each select="/">
<xsl:value-of select="concat(ancestor::FIXML/Batch/MktDef/@MktID,',',ancestor::FIXML/Batch/MktDef/@MktSegID,',',ancestor::FIXML/Batch/MktDef/@EfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@NxtEfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@MktSeg,',',ancestor::FIXML/Batch/MktDef/@MarketSegmentDesc,',',ancestor::FIXML/Batch/MktDef/@Sym,',',ancestor::FIXML/Batch/MktDef/@ParentMktSegmID,',',ancestor::FIXML/Batch/MktDef/@Ccy,',',ancestor::FIXML/Batch/MktDef/@MktSegStat,',',ancestor::FIXML/Batch/MktDef/@USFirmFlagt,',',ancestor::FIXML/Batch/MktDef/@PartID,'&#xA;')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

这是我的 Java 代码..

class Xml2Csv {

    public static void main(String args[]) throws Exception {
        File stylesheet = new File("style.xsl");
        //File xmlSource = new File("Testing-1.xml");
        File xmlSource = new File("95FILRDF01PUBLI20170511XEUR6NJ92000.xml");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(xmlSource);

        StreamSource stylesource = new StreamSource(stylesheet);
        Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);
        Source source = new DOMSource(document);
        System.out.println(source.toString());
        System.out.println("Hello");
        Result outputTarget = new StreamResult(new File("MktDef.csv"));
        transformer.transform(source, outputTarget);

    }
}

我正在解析此 xml 并尝试从 MktDef 属性获取数据并将其存储在 CSV 中,如下所示,

MktID   MktSegID    EfctvBizDt  NxtEfctvBizDt   MktSeg  MarketSegmentDesc   Sym ParentMktSegmID Ccy MktSegStat  USFirmFlag  PartID
XEUR    14  5/11/2017   5/15/2017   CONF    FUT 8-13 Y. SWISS GOV.BONDS 6%  CH0002741988    FBND    CHF 1       2
XEUR    14  5/11/2017   5/15/2017   CONF    FUT 8-13 Y. SWISS GOV.BONDS 6%  CH0002741988    FBND    CHF 1       2
XEUR    14  5/11/2017   5/15/2017   CONF    FUT 8-13 Y. SWISS GOV.BONDS 6%  CH0002741988    FBND    CHF 1       2
XEUR    14  5/11/2017   5/15/2017   CONF    FUT 8-13 Y. SWISS GOV.BONDS 6%  CH0002741988    FBND    CHF 1       2
.
.
.

我现在面临的问题是我一直只获得第一个 MktDef 数据。我了解到 XSLT 中存在一些逻辑问题。

我对 XML 和 XSLT 工作非常陌生,所以请有人帮助我解决这个问题。 提前致谢!

最佳答案

当您位于根节点 ( / ) 的模板内部时,for-each 的选择中的 XPath 是相对于该节点的。您想要迭代 MktDef 中的每一个元素,所以它应该是 FIXML/Batch/MktDef .

现在,在 for-each 内部,上下文节点更改为当前的 MkDef每次迭代中的元素。所以,要获取当前的值MktDef元素的属性,您可以从中选择相对值:即 @MktSegID

此外,如果您要发出文字文本(例如 CSV 标题行),请将其放入 <xsl:text> 内元素,以便您可以在模板中使用文本格式和缩进,并且空白不被视为重要。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

  <xsl:template match="/">
    <xsl:text>MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID&#xA;</xsl:text>

    <xsl:for-each select="FIXML/Batch/MktDef">
      <xsl:value-of select="concat(@MktID,',',@MktSegID,',',@EfctvBizDt,',',@NxtEfctvBizDt,',',@MktSeg,',',@MarketSegmentDesc,',',@Sym,',',@ParentMktSegmID,',',@Ccy,',',@MktSegStat,',',@USFirmFlagt,',',@PartID,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

关于java - 需要帮助从 xml 递归获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534087/

相关文章:

java - 使用 xslt 将 xml 转换为 html

html - 使用 node.js 中的 XSLT 样式表将 xml 转换为 html

java - 设计面向对象的系统/GUI

java - 解析 XML,调用 doc.getDocumentElement().getNodeName() 并得到 "h1"的错误输出?

xml - 有没有办法强制/保留 XML 模式中 XML 元素的顺序?

java - 1 两个FrameLayout中的类

xslt 1.0 如何在选择条件下用 0(零)替换空值或空白值

java - 更改 Arr 文件然后将其包含在 Android Studio 中

java - 将 Android 手机图库中的图像保存到 Parse - 无法保存 .jpg 照片

xml - 序列内的 XSD 选择