2016-02-16 3 views
0

У меня есть следующий XML-документ в качестве вклада (InputXML) к программе Java, которая применяет XSL (TransformationXSL) для преобразования вывода XML (OutputXML).Как преобразовать XML, добавляющий дочерний узел с помощью XSLT?

Я хочу добавить дополнительный узел как часть преобразования входного XML. Есть ли лучший способ, чем то, что показано в (TranformationXSL), так как это просто пытается сопоставить элемент и скопировать то, что требуется ??? Любой другой эффективный способ/предложение очень ценится.

InputXML

<?xml version="1.0" encoding="UTF-8"?> 
<tuple> 
    <old> 
     <Customers> 
      <OrderID>10248</OrderID> 
      <CustomerID>VINET</CustomerID> 
      <EmployeeID>8</EmployeeID> 
      <OrderDate>1996-07-04T00:00:00.0</OrderDate> 
      <CustomerID>VINET</CustomerID> 
      <CompanyName>Vins et alcools Chevalier</CompanyName> 
     </Customers> 
    </old> 
</tuple> 

OutputXML

<?xml version="1.0" encoding="UTF-8"?> 
<tuple> 
    <old> 
     <Customers> 
      <Orders> 
       <OrderID>10248</OrderID> 
       <CustomerID>VINET</CustomerID> 
       <EmployeeID>8</EmployeeID> 
       <OrderDate>1996-07-04T00:00:00.0</OrderDate> 
      </Orders> 
      <CustomerID>VINET</CustomerID> 
      <CompanyName>Vins et alcools Chevalier</CompanyName>     
     </Customers> 
    </old> 
</tuple> 

Это TransformationXSL, что я говорил. Можно ли это изменить, чтобы эффективно преобразовать входной XML, чтобы дать желаемый выходной XML ???

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" /> 

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

    <xsl:template match="Customers"> 
     <Customers> 
      <Orders> 
       <OrderID>10248</OrderID> 
       <CustomerID>VINET</CustomerID> 
       <EmployeeID>8</EmployeeID> 
       <OrderDate>1996-07-04T00:00:00.0</OrderDate> 
      </Orders> 
      <CustomerID>VINET</CustomerID> 
      <CompanyName>Vins et alcools Chevalier</CompanyName> 
     </Customers> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Что логика группирования нескольких элементов внутри 'Orders' и мало кто нет? –

+0

Логический дифференциатор - это то, что столбцы из таблицы Orders (база данных NORTHWIND, MS SQL Server) помещаются под тегом Заказы, остальные элементы - столбцы из таблицы Customers. –

+0

Ваш XSLT не имеет для меня никакого смысла: почему вы жестко кодируете значения? - Что касается вопроса: всегда будет только одна запись, содержащая один заказ и один клиент? –

ответ

2

Выход вы показываете может быть легко получено:

XSLT 1,0

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

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

<xsl:template match="Customers"> 
    <xsl:copy> 
     <Orders> 
      <xsl:copy-of select="OrderID | CustomerID[1] | EmployeeID | OrderDate"/> 
     </Orders> 
     <xsl:copy-of select="CustomerID[1] | CompanyName"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо большое @ Майкл! Это сработало, как ожидалось! –

1

Если двойной тег CustomerID в InputXML ошибка, то проверьте мое решение ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" 
       version="1.0" 
       encoding="utf-8" 
       indent="yes" 
       standalone="yes" 
       omit-xml-declaration="no"/> 

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

    <xsl:template match="OrderID"> 
     <xsl:element name="Orders"> 
      <xsl:element name="OrderID"> 
       <xsl:value-of select="../OrderID/text()"/> 
      </xsl:element> 
      <xsl:element name="CustomerID"> 
       <xsl:value-of select="../CustomerID/text()"/> 
      </xsl:element> 
      <xsl:element name="EmployeeID"> 
       <xsl:value-of select="../EmployeeID/text()"/> 
      </xsl:element> 
      <xsl:element name="OrderDate"> 
       <xsl:value-of select="../OrderDate/text()"/> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="EmployeeID"/> 
    <xsl:template match="OrderDate"/> 
</xsl:stylesheet> 
+1

благодарит за это. Что делать, если CustomerID требуется в теге 'Customers', а также в теге' Orders'? Можно ли что-то сделать, чтобы иметь только один элемент под «Клиентами»? (он повторяется дважды!) –

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