Java 使用XSLT将XML标记添加到XML中
我使用WSO2 ESB 4.8.1,希望将JSON转换为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
<?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>