使用XSL从XML属性/值组合获取值

时间:2018-06-30 05:44:01

标签: xml xslt

首先,据我所知,这不仅仅是使用XSL进行xml转换。这是关于向我呈现xml的方式。我已经尽力寻找了,但是找不到与我类似的情况。

XML来源:

<?xml version="1.0"?>
<RepData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header>
        <requestId>2313022420.01</requestId>
        <requestTimeStamp>2018-JUN-30T06:13:40Z</requestTimeStamp>
    </Header>
    <responseProcessing>
        <translatorContext/>
        <styleSheet/>
    </responseProcessing>
    <serviceResponse>
        <Report docType="ACCOUNT">
            <dataSet name="ACCOUNT_DETS">
                <fieldDefinition index="1" id="ACCOUNT_ID" label="Account Number" type="ALPHANUMERIC" length="19" repeatable="FALSE"/>
                <fieldDefinition index="2" id="ACCOUNT_NAME" label="Account Name" type="ALPHANUMERIC" length="35" repeatable="FALSE"/>
                <fieldDefinition index="3" id="CURRENCY" label="Currency" type="ALPHANUMERIC" length="25" repeatable="FALSE"/>
                <fieldDefinition index="4" id="AMOUNT" label="Account Balance" type="ALPHANUMERIC" length="19" repeatable="FALSE"/>
                <record>
                    <field index="1">100004087</field>
                    <field index="2">MY EURO ACCOUNT</field>
                    <field index="3">Euro</field>
                    <field index="4">530,000</field>
                </record>
                <record>
                    <field index="1">200008169</field>
                    <field index="2">USD CASH ACCOUNT</field>
                    <field index="3">US Dollar</field>
                    <field index="4">2,924.82</field>
                </record>
            </dataSet>
        </Report>
    </serviceResponse>
</RepData>

从源头开始,这些字段在fieldDefinition元素下定义。值在field元素中。

我似乎没有办法遍历字段以选择字段值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="RepData/serviceResponse/Report/dataSet/record" >
  <html>
  <body>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Account</th>
        <th>Balance</th>
      </tr>
      <xsl:for-each select="RepData/serviceResponse/Report/dataSet/record/field">
<p>
            <xsl:value-of select="RepData/serviceResponse/Report/dataSet/record/field" />
</p>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

上面的XSL仅返回空白,但是如果我将'mode="toc"'添加到匹配的所有数据中,则会得到xml中所有值的转储:

2313022420.01 2018-JUN-30T06:13:40Z 100004087 MY EURO ACCOUNT Euro 530,000 200008169 USD CASH ACCOUNT US Dollar 2,924.82 

这就是我要的(字段名称来自label中的fieldDefinition属性):

Account Number|Account Name       |Currency  |Account Balance
100004087     |MY EURO ACCOUNT    |Euro      |530,000
200008169     |USD CASH ACCOUNT   |US Dollar |2,924.82

2 个答案:

答案 0 :(得分:3)

模板匹配和内部for-each循环不正确。您可以进行以下更改以获得HTML表。

假设field中的record个元素的数量与fieldDefinition个元素的数量(在这种情况下为4个)匹配,则可以使用以下模板。可以有多个选项来获取输出,这里我使用了多个for-each循环。您还可以使用模板方法来获取输出。

<!-- Template match with document root element  -->
<xsl:template match="/">
    <html>
        <body>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <!-- Loop to generate the header row of the table -->
                    <xsl:for-each select="RepData/serviceResponse/Report/dataSet/fieldDefinition">
                        <th><xsl:value-of select="@label" /></th>
                    </xsl:for-each>
                </tr>
                <!-- Loop for each "record" -->
                <xsl:for-each select="RepData/serviceResponse/Report/dataSet/record">
                    <tr>
                        <!-- Loop for each column below the header -->
                        <xsl:for-each select="field">
                            <td><xsl:value-of select="." /></td>
                        </xsl:for-each>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

输出

HTML Table

答案 1 :(得分:1)

<h1 onclick="clickTriggered()">click here</h1>