【问题标题】:XSL to show parent as columns, with matching children as rowsXSL 将父级显示为列,匹配的子级显示为行
【发布时间】:2016-10-14 10:43:06
【问题描述】:

我是 XML 和 XSL 的新手。我正在尝试获取由我们的供应商软件生成的 XML 字符串并将其转换为 Excel 格式。 XML 可以有重复的行,每行都有许多关联的子字段。子字段在每行之间总是相同的,并且顺序相同,但在不同的 XML 中可能不同。行数会因文件而异。

我感觉这里有一个 for-each,可能是嵌套的,也可能是使用关系位置,但是我很难将我的头绕在查询函数上。我查看了许多示例,但每个解决方案都是针对该问题量身定制的,但我没有找到一个与我的期望输出一样的解决方案。

任何帮助,或至少在正确方向上的推动,将不胜感激。

谢谢!

示例 XML:

<?xml version="1.0" standalone="yes" ?>
<RpcData SrcNm="SnapshotBuckets" SrcTyp="DIR" ClientID="000" LoanNo="0000000000" Borrower="" RsltCd="0">
  <RepeatingFieldSet Nm="Hazard" Type="All Data" Count="3">
    <Row Index="1">
      <Fld Nm="Type">A</Fld>
      <Fld Nm="AgentCode">TESTAP</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">APPLE</Fld>
      <Fld Nm="Agent Desc Line 2">PICKERS</Fld>
      <Fld Nm="Agent Desc Line 3">123 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1212</Fld>
      <Fld Nm="Agent State">AL</Fld>
      <Fld Nm="Agent ZIP Code">00001</Fld>
    </Row>
    <Row Index="2">
      <Fld Nm="Type">B</Fld>
      <Fld Nm="AgentCode">TESTBA</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">BANANA</Fld>
      <Fld Nm="Agent Desc Line 2">BUNCHERS</Fld>
      <Fld Nm="Agent Desc Line 3">456 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1213</Fld>
      <Fld Nm="Agent State">AK</Fld>
      <Fld Nm="Agent ZIP Code">00002</Fld>
    </Row>
    <Row Index="3">
      <Fld Nm="Type">C</Fld>
      <Fld Nm="AgentCode">TESTCH</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">CHERRY</Fld>
      <Fld Nm="Agent Desc Line 2">PITTERS</Fld>
      <Fld Nm="Agent Desc Line 3">789 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1214</Fld>
      <Fld Nm="Agent State">CA</Fld>
      <Fld Nm="Agent ZIP Code">00003</Fld>
    </Row>
  </RepeatingFieldSet>
</RpcData>

期望的输出:

字段 1 2 3 类型 A B C 代理代码 TESTAP TESTBA TESTCH 代理城市 ANYTOWN ANYTOWN ANYTOWN Agent Desc Line 1 APPLE BANANA CHERRY Agent Desc Line 2 PICKERS BUNCHERS PITTERS 代理 Desc Line 3 123 MAIN ST 456 MAIN ST 789 MAIN ST 代理电话 (718) 555-1212 (718) 555-1213 (718) 555-1214 代理国 AL AK CA 代理邮编 00001 00002 00003

XSL 到目前为止:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x="urn:schemas-microsoft-com:office:excel">
    <xsl:template match="/">
        <xsl:processing-instruction name="mso-application"><xsl:text>progid="Excel.Sheet"</xsl:text></xsl:processing-instruction>
        <Workbook>
            <Worksheet ss:Name="Sheet1">
                <Table>
                    <Row>
                        <Cell>Business Name</Cell>
                        <xsl:for-each select="RpcData/RepeatingFieldSet/Row">
                            <Cell>
                                <xsl:value-of select="@Index"/>
                            </Cell>
                        </xsl:for-each>
                    </Row>
                    <xsl:for-each select="RpcData/RepeatingFieldSet/*/Fld">
                        <Row>
                            <Cell>
                                <xsl:value-of select="@Nm"/>
                            </Cell>
                            <xsl:for-each select="*">
                                <Cell>
                                    <xsl:value-of select="."/>
                                </Cell>
                            </xsl:for-each>
                        </Row>
                    </xsl:for-each>
                </Table>
            </Worksheet>
        </Workbook>
   </xsl:template>      
</xsl:stylesheet>

【问题讨论】:

    标签: xml excel xslt


    【解决方案1】:

    IIUC,你想转置给定的表 - 行到列,字段到行。下面的样式表显示了如何做到这一点。为简单起见,这会生成一个 HTML 表格 - Excel 工作表的调整应该是微不足道的。

    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:template match="/RpcData">
        <xsl:variable name="col" select="RepeatingFieldSet/Row"/>
        <xsl:variable name="row" select="RepeatingFieldSet/Row[1]/Fld"/>
        <table border="1">
            <!-- header row -->
            <tr>
                <th>Field</th>
                <xsl:for-each select="$col">
                    <th>
                        <xsl:value-of select="@Index"/>
                    </th>
                 </xsl:for-each>
            </tr>
            <!-- data rows -->
            <xsl:for-each select="$row">
                <xsl:variable name="i" select="position()"/>
                <tr>
                    <th><xsl:value-of select="@Nm"/></th>
                    <xsl:for-each select="$col">
                        <td>
                            <xsl:value-of select="Fld[$i]"/>
                        </td>
                    </xsl:for-each>
                </tr>    
            </xsl:for-each>
        </table>
    </xsl:template>
    
    </xsl:stylesheet>
    

    应用于您的示例输入,(渲染的)结果将是:

    【讨论】:

    • 正是我想要的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 2020-01-21
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多