xslt-1.0 - 如何处理不同长度/更多“行”的文件
问题描述
我的问题是,我的输入会有不同的长度/行。我当前的代码(感谢 michael.hor257k 上一个问题)适用于我的测试文件,但我确信它不适用于包含更多项目的文件。
例如:
具有 100 条记录的输入文件或具有 2 条记录的输入文件。
我也不确定如何忽略最后一条记录,因为它是在转换为输入文件的原始 csv 文件中创建的垃圾。
输入:
<csv-xml>
<record line="1">
<csv-field-1>1</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3>7654321</csv-field-3>
<csv-field-4>1</csv-field-4>
<csv-field-5>08/08/19</csv-field-5>
<csv-field-6>08/08/19</csv-field-6>
</record>
<record line="2">
<csv-field-1>2</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3>12345678</csv-field-3>
<csv-field-4>3</csv-field-4>
</record>
<record line="3">
<csv-field-1>2</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3>22345679</csv-field-3>
<csv-field-4>7</csv-field-4>
</record>
<record line="4">
<csv-field-1>2</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3>32345680</csv-field-3>
<csv-field-4>6</csv-field-4>
</record>
<record line="5">
<csv-field-1>2</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3>42345681</csv-field-3>
<csv-field-4>2</csv-field-4>
</record>
<record line="6">
<csv-field-1>3</csv-field-1>
<csv-field-2>12345</csv-field-2>
<csv-field-3></csv-field-3>
</record>
</csv-xml>
代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<orders>
<order>
<accountNo>
<xsl:value-of select="csv-xml/record[@line>='1']/csv-field-3"/>
</accountNo>
<orderDate>
<xsl:value-of select="csv-xml/record[@line>='1']/csv-field-5"/>
</orderDate>
<orderItems>
<orderItem>
<productCode>
<xsl:value-of select="csv-xml/record[@line>='2']/csv-field-3"/>
</productCode>
<Quantity>
<xsl:value-of select="csv-xml/record[@line>='2']/csv-field-4"/>
</Quantity>
</orderItem>
<orderItem>
<productCode>
<xsl:value-of select="csv-xml/record[@line>='3']/csv-field-3"/>
</productCode>
<Quantity>
<xsl:value-of select="csv-xml/record[@line>='3']/csv-field-4"/>
</Quantity>
</orderItem>
<orderItem>
<productCode>
<xsl:value-of select="csv-xml/record[@line>='4']/csv-field-3"/>
</productCode>
<Quantity>
<xsl:value-of select="csv-xml/record[@line>='4']/csv-field-4"/>
</Quantity>
</orderItem>
<orderItem>
<productCode>
<xsl:value-of select="csv-xml/record[@line>='5']/csv-field-3"/>
</productCode>
<Quantity>
<xsl:value-of select="csv-xml/record[@line>='5']/csv-field-4"/>
</Quantity>
</orderItem>
</orderItems>
</order>
</orders>
</xsl:template>
</xsl:stylesheet>
我的输出:
<?xml version="1.0"?>
<orders>
<order>
<accountNo>7654321</accountNo>
<orderDate>08/08/19</orderDate>
<orderItems>
<orderItem>
<productCode>12345678</productCode>
<Quantity>3</Quantity>
</orderItem>
<orderItem>
<productCode>22345679</productCode>
<Quantity>7</Quantity>
</orderItem>
<orderItem>
<productCode>32345680</productCode>
<Quantity>6</Quantity>
</orderItem>
<orderItem>
<productCode>42345681</productCode>
<Quantity>2</Quantity>
</orderItem>
</orderItems>
</order>
</orders>
我想要的输出:
<?xml version="1.0"?>
<orders><order accountNo="7654321" orderDate="08/08/19">
<orderItems>
<orderItem productCode="12345678" quantity="3"/>
<orderItem productCode="22345679" quantity="7"/>
<orderItem productCode="32345680" quantity="6"/>
<orderItem productCode="42345681" quantity="2"/>
</orderItems>
</order>
</orders>
解决方案
简单地说:
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="/csv-xml">
<xsl:variable name="header" select="record[1]" />
<orders>
<order accountNo="{$header/csv-field-3}" orderDate="{$header/csv-field-5}">
<orderItems>
<xsl:for-each select="record[position() != 1 and position() != last()]">
<orderItem productCode="{csv-field-3}" quantity="{csv-field-4}"/>
</xsl:for-each>
</orderItems>
</order>
</orders>
</xsl:template>
</xsl:stylesheet>
PS 阅读有关属性值模板的信息。
推荐阅读
- sql - 从数据输出中更改特定数据的位置
- hibernate - Hibernate/JPA 缓存对多节点架构的影响
- visual-studio-code - VS Code Intellisense 显示废话
- android - 任务 ':app:generateDebugBuildConfig' 执行失败。飘飘然
- angular - 输入 Angular [ngClass] - [(ngModel)] 时更改边框输入
- r - R,每列/样本删除零个条目并计算唯一出现。将它们绘制为堆积条形图
- azure-cognitive-search - "SearchAsync" InvalidCastException Null 对象无法转换为值类型
- mysql - 即使在模型中设置公共 $increments = false 之后,Laravel 8 也会自动增加列
- python - 如何解决 conda 的 pycosat 依赖?
- java - 摩托罗拉 MC9000 手持设备失去与服务器的连接(服务器或网络参数?)