我有一堆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文件中或更新现有文件。
答案 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>