XSLT 1.0 - 多个子节点格式化输出

时间:2015-06-18 14:03:17

标签: xslt nodes

我可以使用For-Each执行此操作,但在Apply_Templates中遇到一些问题。

XML数据包含不同的子节点,但我希望显示所有子节点及其父节点信息。

<orders>
<order>
    <customer>1</customer>
    <items>
        <item>
            <name>Widget A</name>
            <price>10</price>
            <code>1A</code>
        </item>
    </items>
</order>
<order>
    <customer>2</customer>
    <items>
        <item>
            <name>Widget A</name>
            <price>10</price>
            <code>1A</code>
        </item>
    </items>
    <items>
        <item>
            <name>Widget B</name>
            <price>20</price>
            <code>2B</code>
        </item>
    </items>
</order>
<order>
    <customer>3</customer>
    <items>
        <item>
            <name>Widget A</name>
            <price>10</price>
            <code>1A</code>
        </item>
    </items>
    <items>
        <item>
            <name>Widget B</name>
            <price>10</price>
            <code>1A</code>
        </item>
    </items>
    <items>
        <item>
            <name>Widget C</name>
            <price>30</price>
            <code>3C</code>
        </item>
    </items>
</order>

如您所见,每个订单每个客户有多个项目。我希望输出看起来像这样:

Customer, Name, Price, Code
1, Widget A, 10, 1A
2, Widget A, 10, 1A
2, Widget B, 20, 2B
3, Widget A, 10, 1A
3, Widget B, 20, 2B
3, Widget C, 30, 3C

当我申请模板时,我只能显示第一个项目而不能显示其他项目。如果您认为我应该发布我的XSL,请告诉我,但我认为这应该很简单。我想摆脱使用for-each。

2 个答案:

答案 0 :(得分:1)

您可以尝试这种方式:

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

  <xsl:template match="/">
    <xsl:text>Customer, Name, Price ,Code&#xa;</xsl:text>
    <xsl:apply-templates select="//item"/>
  </xsl:template>

  <xsl:template match="item">
    <xsl:value-of select="../../customer"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="name"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="price"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="code"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>
</xsl:stylesheet>
  • 第一个模板匹配输出文档中的根元素和打印标题。

  • 第二个模板匹配item个元素,并输出相应的逗号分隔值。这样,您可以在输出文档中包含每个item的行,而无需使用for-each构造。

答案 1 :(得分:0)

我认为真正基于模板的方法看起来像这样:

XSLT 1.0

Random rand = new Random();
string filename = "";
do
{
    int randNo = rand.Next(100000, 999999);
    filename = "C:\\test" + randNo + ".txt";
} while (File.Exists(filename));
using (var write = new StreamWriter(filename))
{
//Stuff
}

然而,正如我在你的问题的评论中所提到的,除了将代码分解为难以理解的不连续的块之外,这没有任何明显的目的。