1

假设我有以下 XML 并且我只关心 FruitId、客户 Numbereaten 和 Weight 属性。

<AllFruits xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- All fruits below. -->
<Fruit>
  <FruitId>Bannana</FruitId>
  <FruitColor>Yellow</FruitColor>
  <FruitShape>Moon</FruitShape>
  <Customer>
     <Name>Joe</Name>
     <Numbereaten>5</NumberEaten>
     <Weight>2.6</Weight>
  </Customer>
  <Customer>
     <Name>Mark</Name>
     <Numbereaten>8</NumberEaten>
     <Weight>5.0</Weight>
  </Customer>
</Fruit>
<Fruit>
  <FruitId>Apple</FruitId>
  <FruitColor>Red</FruitColor>
  <FruitShape>Circle</FruitShape>
  <Customer>
     <Name>Joe</Name>
     <Numbereaten>2</NumberEaten>
     <Weight>1.5</Weight>
  </Customer>
</Fruit>
<Fruit>
  <FruitId>Pear</FruitId>
  <FruitColor>Green</FruitColor>
  <FruitShape>Oval</FruitShape>
  <Customer>
     <Name>Mark</Name>
     <NumberEaten>1</NumberEaten>
     <Weight>6</Weight>
  </Customer>
  <Customer>
     <Name>Josh</Name>
     <NumberEaten>9</NumberEaten>
     <Weight>10</Weight>
  </Customer>
  <Customer>
     <Name>Willis</Name>
     <NumberEaten>2</NumberEaten>
     <Weight>5.6</Weight>
  </Customer>
</Fruit>
</AllFruits>

什么是适合上述情况的 XSLT?我尝试了以下方法,但没有奏效。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="text" encoding="ISO-8859-1" />
    <xsl:variable name="newline" select="'&#xA;'"/>
    <xsl:template match="Fruit">
        <xsl:for-each select="Customer">
            <xsl:value-of select="preceding-sibling::FruitId" />
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Numbereaten" />
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Weight" />
            <xsl:value-of select="$newline" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

为了尝试测试 XSLT,我使用了以下 Java 代码:

   Source xmlSource = new StreamSource(new File("xmlFile"));
   Source xsltSource = new StreamSource(new File("xsltFile"));
   Transformer transformer = TransformerFactory.newInstance().newTransformer(xsltSource);
   transformer.transform(xmlSource, new StreamResult(System.out));

我得到的只是输出到控制台的 XML ......不是我想要的格式:

Bannana, 5, 2.6
Bannana, 8, 5
...
Apple 6, 5
Apple 3, 2

如果我尝试做的事情不起作用,如果除了 XSLT 之外还有其他更好的方法,请告诉我。感觉像这样的事情应该很简单。

4

3 回答 3

2

如果您想摆脱空行,只需在您的 XSLT 文件中添加行后

<xsl:variable name="newline" select="'&#xA;'"/> 

这条线

<xsl:strip-space elements="*" />
于 2013-05-12T16:05:48.807 回答
1

您实际上是在进行copy转换,即没有应用样式表转换。这就是为什么您只是在控制台上将源 XML 文件的内容视为输出的原因。

要应用样式表,您需要在获取您的实例时设置它Transformer

Source stylesource = new StreamSource(new File("/path/to/your/stylesheet.xsl"));
Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);


XSLT 输出:

Bannana,5,2.6
Bannana,8,5.0

Apple,2,1.5

Pear,1,6
Pear,9,10
Pear,2,5.6
于 2013-05-12T04:42:57.960 回答
0

你在哪里xslStream被使用?

做这个:

Source xmlSource = new StreamSource(new File("xmlFile"));
Source xsltSource = new StreamSource(new File("xsltFile"));

TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(xsltSource);
transformer.transform(xmlSource, System.out);
于 2013-05-12T04:50:56.220 回答