当前位置: 首页 > 知识库问答 >
问题:

将节点名称作为参数从java代码传递给. xsl文件以从与其节点名称对应的. xml文件中获取值

郤瀚
2023-03-14

我写了java代码从. xsd文件中获取元数据,即子节点,并将此元数据作为参数传递给. xsl文件,以便根据. xml文件中的对应名称获取值,最后生成. csv格式的输出

XML文档

<personal>
    <details>
        <name>John</name>
        <age>50</age>
        <country>USA</country>
    </details>
    <details>
        <name>Jams</name>
        <age>40</age>
        <country>UK</country>
    </details>
</personal>

**其xsd**

<xs:element minOccurs="0" maxOccurs="unbounded" name="details">
      <xs:complexType>
        <xs:sequence>
          <xs:element minOccurs="0" name="name" type="xs:string" />
          <xs:element minOccurs="0" name="age" type="xs:string" />
          <xs:element minOccurs="0" name="country" type="xs:string" />
          </xs:sequence>
      </xs:complexType>
    </xs:element>

XSLT样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="Elements"/>
    <xsl:template match="/">
        <xsl:for-each select="//details">
            <xsl:value-of select="$Elements"/>
            <xsl:value-of select="'&#xA;'"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Java代码

公共静态空main(String args[])抛出异常{

    //Read the XML data file and code of stylesheet
    File stylesheet = new File("src/style.xsl");
    File xmlSource = new File("src/data.xml");

    //It enables appln to obtain parser to produces DOM object from XML documents
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(xmlSource);

    Document doc = builder.parse (new File("src/structure.xsd")); 
    NodeList list = doc.getElementsByTagName("xs:element"); 

    String cols="";
    //loop to print data
    for(int i = 0 ; i < list.getLength(); i++){
        Element first = (Element)list.item(i);      
        if(first.hasAttributes() && first.getAttributeNode("type") != null){
            String nm = first.getAttribute("name"); 
            cols=cols+nm+",";
        }
    }
    cols=cols.substring(0, cols.length()-1);
    System.out.println(cols);

    //It process XML data into required format by reading .xsl file.
    StreamSource stylesource = new StreamSource(stylesheet);
    Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);

    transformer.setParameter("Elements", cols);

    //Object that implements this interface contains the information needed to act as source input (XML source or transformation instructions).
    Source source = new DOMSource(document);

    //Directory in which file need to be save after transformation from xml to csv
    Result outputTarget = new StreamResult(new File("C:/Users/Desktop/a.csv"));

    //Transforming
    transformer.transform(source, outputTarget);
}

实际输出

我正在得到。csv输出为

name,age,country
name,age,country

预期输出为

John,50,USA
Jams,40,UK

共有1个答案

澹台建华
2023-03-14

使用此转换(我已为全局参数$Elements提供了一个默认值,但每次从Java代码调用转换时都会覆盖此值):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
    <xsl:param name="Elements" select="'name,age,country'"/>

    <xsl:template match="details">
        <xsl:apply-templates select="
        *[contains(concat(',',$Elements,','),
                   concat(',',name(),',')
                   )]"/>
        <xsl:value-of select="'&#xA;'"/>
    </xsl:template>

    <xsl:template match="details/*">
      <xsl:if test="not(position()=1)">,</xsl:if>
      <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<personal>
    <details>
        <name>John</name>
        <age>50</age>
        <country>USA</country>
    </details>
    <details>
        <name>Jams</name>
        <age>40</age>
        <country>UK</country>
    </details>
</personal>

产生所需的正确结果:

John,50,USA
Jams,40,UK
 类似资料:
  • 我有一个xslt文件,可以使用ApacheFop将xml文件转换为pdf。但是我的xslt中没有关于名称空间的所有信息。它依赖于xml。我可以用java分析xml文档,并从xml中获取所有名称空间。但我不知道如何将这个名称空间从java传递到xslt文件,以及下一步如何在

  • 问题内容: 我读了很多文章,尝试了很多事情,但仍然无法通过xsl在参数中找到值。我从java的sun xalan开始,但是从来没有运行过,所以我改用saxon无济于事。我想将两个xml文档与xls合并为一个。永远不要在文件系统上,这是用于构建xml字符串/ docs的Web应用程序。我尝试将DTMAxisIterator,DomSource,Doc传递给以xsl,字符串设置的Node。在带有xsl

  • 问题内容: 我有下一个XML: 如何获得此节点?我试过了 但它返回一个空数组。我该怎么做? 问题答案: 您需要确保XML解析器支持名称空间。 您还应该确保关闭,最好使用try-with-resources。

  • 我使用的xml文件“savedwsdl.txt”的部分内容如下... 我写了下面给出的java代码,应该用什么来获取wsdl的子节点名:消息标记名为“debitrequest”

  • 找不到我的问题的解决方案。我有要识别的节点,我的意思是-我必须获得以下情况下的节点名称: 当我使用以下语法时(FirePath,直接从浏览器) 或 然后我得到节点名称(链接组和文本img)。 在robot框架中,它不适用于关键字Get Text或Get Value。我收到消息:“InvalidSelectorException:消息:无效选择器:由于以下错误,无法找到xpath表达式名称为((//

  • 问题内容: 如何使用Jackson从JSON树中接收节点名称?JSON文件看起来像这样: 我有 并且需要类似的东西 谢谢。 问题答案: 此答案适用于2+之前的Jackson版本(最初写为1.8)。请参阅@SupunSameera的答案,以获取与较新版本的Jackson兼容的版本。 “节点名称”的JSON术语是“键”。由于 不包含键,因此您需要进行不同的迭代: 如果 只 需要查看键,则可以使用以下方