2016-07-29 2 views
0

Я использую XSLT для преобразования определенного xml, который содержит все значения, сформированные как атрибуты для другого xml, сохраняя значения в качестве дочернего элемента. В моем xml есть два имени детей, один - aa, а другой - bbb. Преобразование работает отлично, когда я проверяю значения как для aa, так и для bbb. Проблема в том, что я хочу удалить/игнорировать атрибуты, найденные в родительском элементе этих дочерних элементов.при преобразовании атрибутов в элемент с XSLT, как игнорировать только атрибуты в родительском элементе

Я показываю ниже два значительных шага, которые я пробовал до сих пор. Первая из них - моя оригинальная идея, но я хочу, чтобы она избегала родительских атрибутов (именно «cod» и «package» в моем xml).

Второе - это следствие поиска, но оно действительно отходит от того, что я хочу. Тем не менее, вторая пробная версия может помочь мне выразить, что, вероятно, мне не хватает ни одного «шаблона» или «комманды», чтобы пропустить атрибуты из корневого элемента.

MyApp.java

Path f = Paths.get("C:\\in1.xsl"); 
//Path f = Paths.get("C:\\in2.xsl"); 
InputStream resourceAsStream = Files.newInputStream(f); 
StreamSource xsl = new StreamSource(resourceAsStream); 
Transformer transformer; 
transformer = TransformerFactory.newInstance().newTransformer(xsl); 
StreamSource in = new StreamSource(
       new FileInputStream("C:\\my_xml.xml")); 
StreamResult out = new StreamResult(System.out); 
transformer.transform(in, out); //in1 produced out1 and in2 produced out2 

my_xml.xml

<c:product xmlns:c="myapp"> 
     <c:item cod="789"> 
       <c:aa name="024" value="123"/> 
       <c:bbb name="0105" value="123456"/> 
       <c:bbb name="0122" value="T"/> 
       <c:aa name="071" value="00000001"/> 
     </c:item> 
     <c:item package="123" cod="11111"> 
       <c:aa name="002" value="753"/> 
       <c:aa name="003" value="456"/> 
       <c:bbb name="0146" value="147852"/> 
     </c:item> 
</c:product> 

in1.xsl

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

<xsl:output method="xml" encoding="UTF-8" indent="yes" standalone="no" omit-xml-declaration="yes"/> 
     <xsl:template match="@*"> 
       <xsl:element name="{name(.)}"> 
        <xsl:value-of select="."/> 
       </xsl:element> 
     </xsl:template> 
     <xsl:template match="*"> 
       <xsl:copy> 
        <xsl:apply-templates select="@*|node()"/> 
       </xsl:copy> 
     </xsl:template> 
</xsl:stylesheet> 

in2.xls (источник Copy XML file contents except for root node and attribute XSLT)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


    <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/> 
    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="/*"> 
    <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 

out1.xml (я не хочу элемент трески в первом пункте ни я не хочу пакет и треска во втором пункте)

<c:product xmlns:c="myapp"> 
<c:item> 
<cod>789</cod> 
<c:aa> 
<name>024</name> 
<value>123</value> 
</c:aa> 
<c:bbb> 

<name>0105</name> 

<value>123456</value> 

</c:bbb> 

<c:bbb> 

<name>0122</name> 

<value>T</value> 

</c:bbb> 

<c:aa> 

<name>071</name> 

<value>00000001</value> 

</c:aa> 

</c:item> 

<c:item> 

<package>123</package> 

<cod>11111</cod> 

<c:aa> 

<name>002</name> 

<value>753</value> 

</c:aa> 

<c:aa> 

<name>003</name> 

<value>456</value> 

</c:aa> 

<c:bbb> 

<name>0146</name> 

<value>147852</value> 

</c:bbb> 

</c:item> 

</c:product> 

out2.xml (ну, есть один момент, который я пытался взять преимущество выразить себя: корневой элемент получает другое лечение. Если я считаю, как лечить корневой элемент, игнорируя их атрибуты и смешивают с остальными in.xls я, вероятно, обнаружить мое решение)

 <aa name="024" value="123"/> 

     <bbb name="0105" value="123456"/> 

     <bbb name="0122" value="T"/> 

     <aa name="071" value="00000001"/> 

 <aa name="002" value="753"/> 

     <aa name="003" value="456"/> 

     <bbb name="0146" value="147852"/> 

+0

Это довольно сбивает с толку: можете ли вы опубликовать точный результат, который вы ** хотите получить **? –

ответ

0

Я угадываю (!), Вы хотите сделать что-то вроде:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:c="myapp" 
exclude-result-prefixes="c"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="c:item"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

При применении к вашему входному примеру, результат будет:

<product> 
    <item> 
     <aa> 
     <name>024</name> 
     <value>123</value> 
     </aa> 
     <bbb> 
     <name>0105</name> 
     <value>123456</value> 
     </bbb> 
     <bbb> 
     <name>0122</name> 
     <value>T</value> 
     </bbb> 
     <aa> 
     <name>071</name> 
     <value>00000001</value> 
     </aa> 
    </item> 
    <item> 
     <aa> 
     <name>002</name> 
     <value>753</value> 
     </aa> 
     <aa> 
     <name>003</name> 
     <value>456</value> 
     </aa> 
     <bbb> 
     <name>0146</name> 
     <value>147852</value> 
     </bbb> 
    </item> 
</product> 

Обратите внимание, что c:item элемент получения специального лечения (2-й шаблон) является не Корневой элемент.

+0

Я не могу представить лучшего и более точного ответа.Я не знаю, что неясно, но ваше предположение верно и ваш ответ. Я выбираю ваш ответ как окончательный ответ. P.S .: Мне немного любопытно: возможно ли с XLST и XLS предоставить ответ в json вместо XML? Точно такой же входной файл, но выводимый в json без первого преобразования из xml в out xml с помощью xls, а затем из out xml в json с традиционными способами в java? Таким образом, вход будет xml, и выход будет json без атрибутов c: item –

+1

Я считаю, что это должно быть возможно. Я предлагаю вам задать это по новому вопросу - и показать точный результат JSON, который вы ожидаете получить. –

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