Java 使用XSLT将XML标记添加到XML中

Java 使用XSLT将XML标记添加到XML中,java,xslt,wso2,wso2esb,transformation,Java,Xslt,Wso2,Wso2esb,Transformation,我使用WSO2 ESB 4.8.1,希望将JSON转换为XML,但默认转换对我来说还不够。我有一个输入转换XML: <?xml version="1.0" encoding="UTF-8"?> <locations> <location> <id>7eaf7</id> <name>Biaggio Cafe</name> <tags&g

我使用WSO2 ESB 4.8.1,希望将JSON转换为XML,但默认转换对我来说还不够。我有一个输入转换XML:

 <?xml version="1.0" encoding="UTF-8"?>
              <locations>  
  <location>
      <id>7eaf7</id>
      <name>Biaggio Cafe</name>
      <tags>bar,restaurant,food,establishment</tags>
   </location>
   <location>
      <id>3ef98</id>
      <name>Doltone House</name>
      <tags>food,establishment</tags>
   </location>
      </locations>  
我想得到这个:

<?xml version="1.0" encoding="UTF-8"?>
    <Entries items="2">
    <Item idx = "0">
      <id>7eaf7</id>
          <name>Biaggio Cafe</name>
          <tags>bar,restaurant,food,establishment</tags>
    </Item>
    <Item idx = "1">
          <id>3ef98</id>
          <name>Doltone House</name>
          <tags>food,establishment</tags>
    </Item>
    </Entries>

是否可以使用XSLT实现这一点?也许还有别的办法吗?

试试这个。我还没有测试过,但它应该接近你需要的

<xsl:template match="/">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="locations">
  <xsl:element name="Entries">
    <xsl:attribute name="items">
      <xsl:value-of select="count(location)"/>
    </xsl:attribute>
    <xsl:for-each select="location">
      <xsl:element name="Item">
        <xsl:attribute name="idx">
          <xsl:value-of select="position()"/>
        </xsl:attribute>
        <id><xsl:value-of select="id"/></id>
        <name><xsl:value-of select="name"/></name>
        <tags><xsl:value-of select="tags"/></tags>
      </xsl:element>
    </xsl:for-each>
  </xsl:element>
</xsl:template>
您可以使用xsl:copy

transformer.xsd

Data.xml

out.xml


下面也可以使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:template match="locations"> 
    <Entries items="{count(location)}"> 
      <xsl:for-each select="location"> 
        <Item idx="{position() - 1}"> 
          <id>
            <xsl:value-of select="id"/>
          </id>  
          <name>
            <xsl:value-of select="name"/>
          </name>  
          <tags>
            <xsl:value-of select="tags"/>
          </tags> 
        </Item> 
      </xsl:for-each> 
    </Entries> 
  </xsl:template> 
</xsl:stylesheet>

这可以通过xslt轻松完成。你试过什么?为什么使用id/。?这个表示当前节点,所以它在这里不起作用,只需写id即可。您可以将xsl:element和xsl:attribute替换为,例如,…,这更易于阅读。您可以将for-each替换为apply模板以减少嵌套。。。和…,效果相同,但可读性更强。您可以使用应用模板和匹配模板替换for each,以减少嵌套。谢谢Abel。编辑我的答案:Thx,这是我需要的。
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Xslt {

    public static void main(String[] args) {
        String dataXML = "data.xml";
        String inputXSL = "transformer.xsd";
        String outputXML = "out.xml";

        Xslt st = new Xslt();
        try {
            st.transform(dataXML, inputXSL, outputXML);
        } catch (TransformerConfigurationException e) {
            System.err.println("TransformerConfigurationException");
            System.err.println(e);
        } catch (TransformerException e) {
            System.err.println("TransformerException");
            System.err.println(e);
        }
    }

    public void transform(String dataXML, String inputXSL, String outputXML)
            throws TransformerConfigurationException, TransformerException {

        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource xslStream = new StreamSource(inputXSL);
        Transformer transformer = factory.newTransformer(xslStream);
        StreamSource in = new StreamSource(dataXML);
        StreamResult out = new StreamResult(outputXML);
        transformer.transform(in, out);
        System.out.println("The generated XML file is:" + outputXML);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<locations>
    <location>
        <id>7eaf7</id>
        <name>Biaggio Cafe</name>
        <tags>bar,restaurant,food,establishment</tags>
    </location>
    <location>
        <id>3ef98</id>
        <name>Doltone House</name>
        <tags>food,establishment</tags>
    </location>
</locations> 
<?xml version="1.0" encoding="UTF-8"?>
<Entries items="2">
    <Item idx="0">
        <id>7eaf7</id>
        <name>Biaggio Cafe</name>
        <tags>bar,restaurant,food,establishment</tags>
    </Item>
    <Item idx="1">
        <id>3ef98</id>
        <name>Doltone House</name>
        <tags>food,establishment</tags>
    </Item>
</Entries>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:template match="locations"> 
    <Entries items="{count(location)}"> 
      <xsl:for-each select="location"> 
        <Item idx="{position() - 1}"> 
          <id>
            <xsl:value-of select="id"/>
          </id>  
          <name>
            <xsl:value-of select="name"/>
          </name>  
          <tags>
            <xsl:value-of select="tags"/>
          </tags> 
        </Item> 
      </xsl:for-each> 
    </Entries> 
  </xsl:template> 
</xsl:stylesheet>