2015-11-16 7 views
0

У меня есть куча xml-файлов, которые мне нужно преобразовать с помощью XSLT. Я создал файл XSLT и дал ссылку на него в исходном заголовке xml-файла. Я хочу выполнить скрипт, или код может быть в java/javascript, чтобы исходный xml-файл преобразовывался в обновленный xml или создавался новый модифицированный XML-файл.создать новый xml из существующего xml после преобразования xslt

Вот файлы

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> 

Я могу увидеть обновленный XML во время выполнения инспектировать элемент в Firefox/Safari, но я хотите его в новом xml-файле или обновить.

ответ

0

XSLT - это как программирование, так и язык стилей. Объявление его в заголовке XML-файла только стилирует веб-рендеринг XML-файла. Чтобы фактически преобразовать XML-файл с исходного на конечный, вам нужно запустить оба .xml и .xsl-файла с использованием XSLT-процессора.

Практически все языки общего назначения поддерживают 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"))); 

    } 
} 

Кстати, вам не нужно запускать xsl:for-each в вашем XSLT. Просто используйте идентификатор преобразования, чтобы скопировать всю разметку, а затем вычистить узлы не нужны под <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> 
+0

Спасибо так много. Я уже реализовал его с использованием подобного рода фрагмента, но благодаря объяснению он помог лучше понять. –

Смежные вопросы