2013-11-13 5 views
1

Я знаю, это может показаться общей проблемой, но я не пробовал все подобные решения на этом сайте. Сейчас я пытаюсь использовать xslt для преобразования существующего XML-документа в XML-документ, который соответствует новой схеме. Я пытаюсь получить имя и partnum для каждого продукта. Но вместо этого я просто получаю один узел продукта со всеми именами и partnums в нем. Я пробовал использовать для каждого цикла, я пробовал это решение how to get a transformed xml file with all child tags of every occurance of parent tag under only one parent tag с очень близкими результатами, но единственная проблема заключается в том, что я получаю все теги завершения продукта, вложенные в тег продукта.Получить дочерний узел для каждого родительского узла

Вот мой текущий XML:

<CATALOG> 

<PRODUCT NAME="18 Volt Cordless DRILL" PARTNUM="12"> 
    <SPECIFICATIONS><WEIGHT>8 oz. </WEIGHT><POWER>18 Volt</POWER></SPECIFICATIONS> 
    <OPTIONS FINISH="Polished"/> 
    <PRICE>  <MSRP>139.99</MSRP> 
    <WHOLESALE>89.99</WHOLESALE><SHIPPING>10.00</SHIPPING></PRICE> 
    <NOTES>On sale for $99.99 for one week only.</NOTES> 
</PRODUCT> 
<PRODUCT NAME="Variable Speed Drill Press" PARTNUM="76" CATEGORY="Shop-Professional"> 
    <SPECIFICATIONS><WEIGHT>100 lbs.</WEIGHT><POWER>120 Volt</POWER></SPECIFICATIONS> 
    <OPTIONS FINISH="Metal"/> 
    <PRICE> <MSRP>299.99</MSRP> 
<WHOLESALE>199.99</WHOLESALE><SHIPPING>50.00</SHIPPING></PRICE> 
    <NOTES>Ground shipping only.</NOTES> 
</PRODUCT> 
<PRODUCT NAME="Gas powered generator" PARTNUM="54" CATEGORY="Shop-Professional"> 
    <SPECIFICATIONS><WEIGHT>75 lbs.</WEIGHT><POWER>120 Volt</POWER></SPECIFICATIONS> 
    <OPTIONS FINISH="Metal" ADAPTER="Optional" CASE="NotApplicable"/> 
    <PRICE> <MSRP>1122.99</MSRP><WHOLESALE>654.99</WHOLESALE><SHIPPING>41.00</SHIPPING></PRICE> 
    <NOTES>The most powerfull generator made.</NOTES> 
</PRODUCT> 
<PRODUCT NAME="Hammer" PARTNUM="1" CATEGORY="HandTool">   
    <SPECIFICATIONS><WEIGHT>5 lbs.</WEIGHT></SPECIFICATIONS> 
    <PRICE> <MSRP>9.99</MSRP><WHOLESALE>7.99</WHOLESALE><SHIPPING>2.00</SHIPPING></PRICE> 
</PRODUCT> 
<PRODUCT NAME="Screwdriver" PARTNUM="2" CATEGORY="HandTool">  
    <SPECIFICATIONS><WEIGHT>1 lbs.</WEIGHT></SPECIFICATIONS> 
    <PRICE> <MSRP>11.99</MSRP><WHOLESALE>9.99</WHOLESALE><SHIPPING>3.00</SHIPPING></PRICE> 
</PRODUCT> 
<PRODUCT NAME="Saw" PARTNUM="3" > 
    <SPECIFICATIONS><WEIGHT>3 lbs.</WEIGHT></SPECIFICATIONS> 
     <OPTIONS FINISH="Metal" ADAPTER="NotApplicable" CASE="NotApplicable"/> 
    <PRICE> <MSRP>5.99</MSRP><WHOLESALE>7.99</WHOLESALE><SHIPPING>2.50</SHIPPING></PRICE> 
</PRODUCT> 
<PRODUCT NAME="Black and Decker Variable Drill" PARTNUM="2456" CATEGORY="HandTool"> 
     <SPECIFICATIONS><WEIGHT>2 lbs." </WEIGHT><POWER>1/3HP</POWER></SPECIFICATIONS> 
     <OPTIONS FINISH="Metal" ADAPTER="Included" CASE="HardShell"/> 
     <PRICE> <MSRP>35.99</MSRP> 
<WHOLESALE>24.95</WHOLESALE><SHIPPING>4.95</SHIPPING></PRICE> 
     <NOTES>This item is on clearance.</NOTES> 
</PRODUCT> 
<PRODUCT NAME="Black and Decker Rotary Tablesaw" PARTNUM="2364" CATEGORY="Table"> 
     <SPECIFICATIONS><WEIGHT>25 lbs.</WEIGHT><POWER>2/3HP</POWER></SPECIFICATIONS> 
     <OPTIONS FINISH="Metal" ADAPTER="NotApplicable" CASE="NotApplicable"/> 
     <PRICE> <MSRP>45.95</MSRP><WHOLESALE>34.95</WHOLESALE><SHIPPING>4.95</SHIPPING></PRICE> 
     <NOTES>See Manufacturer's warning label.</NOTES> 
</PRODUCT> 
<PRODUCT NAME="Black and Decker Workman's Bench" PARTNUM="3446" CATEGORY="Shop-Professional"> 
     <SPECIFICATIONS><WEIGHT>50 lbs.</WEIGHT></SPECIFICATIONS> 
     <OPTIONS FINISH="Matte" ADAPTER="NotApplicable" CASE="NotApplicable"/> 
     <PRICE> <MSRP>72.45</MSRP><WHOLESALE>56.99</WHOLESALE><SHIPPING>10.95</SHIPPING></PRICE> 
     <NOTES /> 
</PRODUCT> 
</CATALOG> 

Вот результат я получаю

<?xml version="1.0" encoding="utf-8"?> 
<CATALOG> 
    <PRODUCT> 
     <PRODUCT/> 
     <NAME>18 Volt Cordless DRILL</NAME> 
     <PARTNUM>12</PARTNUM> 
     <PRODUCT/> 
     <NAME>Variable Speed Drill Press</NAME> 
     <PARTNUM>76</PARTNUM> 
     <PRODUCT/> 
     <NAME>Gas powered generator</NAME> 
     <PARTNUM>54</PARTNUM> 
     <PRODUCT/> 
     <NAME>Hammer</NAME> 
     <PARTNUM>1</PARTNUM> 
     <PRODUCT/> 
     <NAME>Screwdriver</NAME> 
     <PARTNUM>2</PARTNUM> 
     <PRODUCT/> 
     <NAME>Saw</NAME> 
     <PARTNUM>3</PARTNUM> 
     <PRODUCT/> 
     <NAME>Black and Decker Variable Drill</NAME> 
     <PARTNUM>2456</PARTNUM> 
     <PRODUCT/> 
     <NAME>Black and Decker Rotary Tablesaw</NAME> 
     <PARTNUM>2364</PARTNUM> 
     <PRODUCT/> 
     <NAME>Black and Decker Workman's Bench</NAME> 
     <PARTNUM>3446</PARTNUM> 
     <PRODUCT/> 
    </PRODUCT> 
</CATALOG> 

Вот вывод я пытаюсь получить

<CATALOG> 
     <PRODUCT> 
      <NAME>18 Volt Cordless DRILL</NAME> 
      <PARTNUM>12</PARTNUM> 
     <PRODUCT/> 
     <PRODUCT> 
      <NAME>Variable Speed Drill Press</NAME> 
      <PARTNUM>76</PARTNUM> 
     <PRODUCT/> 
     <PRODUCT> 
      <NAME>Gas powered generator</NAME> 
      <PARTNUM>54</PARTNUM> 
    <PRODUCT/> 
<!---And so on, you get the idea-->   
</CATALOG> 

Вот xslt

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:element name="CATALOG"> 
     <xsl:apply-templates select="/CATALOG"/>  
    </xsl:element> 
</xsl:template> 
<xsl:template match="node()|@*"> 
    <xsl:element name="PRODUCT" > 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 

</xsl:template> 
<xsl:template match="PRODUCT"> 
     <xsl:element name="NAME"> 
      <xsl:value-of select="@NAME"/> 
     </xsl:element> 
     <xsl:element name="PARTNUM"> 
      <xsl:value-of select="@PARTNUM"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Что XSLT вы пробовали? Можете ли вы вставить свой код? –

+0

Извините, забыл xslt, плохо опубликуйте его. – DrinkJavaCodeJava

+0

Я отправил xslt – DrinkJavaCodeJava

ответ

0

Я не уверен, почему у вас есть преобразование идентичности там, поскольку вам нужно только очень ограниченное и определенное подмножество. Но, это должно сделать трюк:

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

    <xsl:template match="/CATALOG"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="PRODUCT"> 
    <xsl:copy> 
     <NAME><xsl:value-of select="@NAME"/></NAME> 
     <PARTNUM><xsl:value-of select="@PARTNUM"/></PARTNUM> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Применительно к вашей входной XML дает следующее:

<CATALOG> 
    <PRODUCT> 
     <NAME>18 Volt Cordless DRILL</NAME> 
     <PARTNUM>12</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Variable Speed Drill Press</NAME> 
     <PARTNUM>76</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Gas powered generator</NAME> 
     <PARTNUM>54</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Hammer</NAME> 
     <PARTNUM>1</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Screwdriver</NAME> 
     <PARTNUM>2</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Saw</NAME> 
     <PARTNUM>3</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Black and Decker Variable Drill</NAME> 
     <PARTNUM>2456</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Black and Decker Rotary Tablesaw</NAME> 
     <PARTNUM>2364</PARTNUM> 
    </PRODUCT> 
    <PRODUCT> 
     <NAME>Black and Decker Workman's Bench</NAME> 
     <PARTNUM>3446</PARTNUM> 
    </PRODUCT> 
</CATALOG> 
Смежные вопросы