在xslt转换后从现有的xml创建新的xml

时间:2015-11-16 22:40:20

标签: xml xslt

我有一堆xml文件需要使用XSLT进行转换。我创建了XSLT文件并在原始xml文件头中提供了它的引用。我想执行脚本或代码可能在java / javascript中,以便原始xml文件转换为更新的xml或创建新的修改的xml文件。

以下是文件

product.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="product-xsl.xsl" ?>
<products>
  <product>
    <sku>12854</sku>
    <productId>1051806941102</productId>
    <name>Manufacturer - Test sku - Color</name>
    <source>bestbuy</source>
    <type>HardGood</type>
    <startDate>2000-03-01</startDate>
    <new>false</new>
    <department>PHOTO/COMMODITIES</department>
 </product>
<products>

产品xsl.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<products>
<xsl:for-each select="products/product">
    <product>
            <sku><xsl:value-of select="sku"/></sku>
            <name><xsl:value-of select="name"/></name>
            <department><xsl:value-of select="department"/></department>
    </product>
</xsl:for-each>
</products>
</xsl:template>
</xsl:stylesheet>

我可以在firefox / safari中执行inspect元素时看到更新的XML,但我希望它在新的xml文件中或更新现有文件。

1 个答案:

答案 0 :(得分:0)

XSLT既是编程语言,也是样式表语言。在XML文件的标头中声明它只会对XML文件的Web呈现进行样式设置。要将XML文件从原始输出实际转换为最终输出,您需要使用XSLT处理器运行.xml和.xsl文件。

几乎所有通用语言都维护着XSLT处理器,包括Java,PHP,Python,C#,VB等等。下面是Java XML转换:

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class XMLTransformation {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {

            String xmlFile = "/Path/to/Original/XML/file.xml";
            String xslFile = "/Path/to/XSL/file.xml";

            TransformerFactory factory = TransformerFactory.newInstance();
            Source xslt = new StreamSource(new File(xslFile));
            Transformer transformer = factory.newTransformer(xslt);

            Source text = new StreamSource(new File(xmlFile));
            transformer.transform(text, new StreamResult(new File("/Path/to/Output/XML/file.xml")));

    }
}

顺便说一句,您不需要在XSLT中运行xsl:for-each。只需使用身份转换来复制整个标记,然后在<products>下删除不需要的节点:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

  <!-- IdentityTransform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

<xsl:template match="product/*[not(local-name()='sku' or
                                   local-name()='name' or
                                   local-name()='department')]">
<!-- ALTERNATIVE:  -->
<!-- <xsl:template match="productId|source|type|startDate|new">  -->
</xsl:template>

</xsl:stylesheet>