我目前正在开发一个读取xml并将特定值返回到文档中的解析器。 我有一点奇怪的XML,我不知道如何处理。这是一个例子:
<record>
<field name="Agreement_Role:addonSection.effectiveStartTime">15/08/2014</field>
<field name="Agreement_Role:addonSection.effectiveEndTime">31/12/9999</field>
<field name="Agreement_Role:addonSection.addonProduct">Gen</field>
<field name="Agreement_Role:addonSection.addonType">ProtectPlus</field>
<field name="Agreement_Role:addonSection.premium">21.70</field>
<field name="Agreement_Role:addonSection.displayOrder">2</field>
<field name="Agreement_Role:addonSection.replaceAddonType">ProtectPlus</field>
<field name="Agreement_Role:addonSection.addonCode">ProtectPlus</field>
<field name="Agreement_Role:addonSection.status">Live</field>
<field name="Agreement_Role:addonSection.cancellationRefund">00</field>
<field name="Agreement_Role:addonSection.effectiveStartTime">15/08/2014</field>
<field name="Agreement_Role:addonSection.effectiveEndTime">31/12/9999</field>
<field name="Agreement_Role:addonSection.addonProduct">Gen</field>
<field name="Agreement_Role:addonSection.addonType">Bd 1</field>
<field name="Agreement_Role:addonSection.premium">35.85</field>
<field name="Agreement_Role:addonSection.displayOrder">4</field>
<field name="Agreement_Role:addonSection.replaceAddonType">Breakdown</field>
<field name="Agreement_Role:addonSection.addonCode">Bd 1</field>
<field name="Agreement_Role:addonSection.status">Live</field>
<field name="Agreement_Role:addonSection.cancellationRefund">00</field>
<field name="acceptanceType">tacitCard</field>
<field name="Type">default</field>
<field name="effectiveDate">17/08/2014 00:00:00 BST</field>
<field name="expiryDate">16/08/2015 23:59:59 BST</field>
<field name="creationDate">15/08/2014 13:27:52 BST</field>
<field name="acceptanceDate">15/08/2014 13:43:27 BST</field>
#other elements follow this format
</record>
此示例中包含两个附加组件。我想使用addonType字段来指定加载项是否存在,如果存在,则显示相关的溢价。
附加组件不会分为父元素。我提供的样本就是我得到的一切。那么我如何在相同名称和路径的两个高级元素之间进行选择呢?
如果有帮助,元素将始终处于相同的顺序,但我希望避免使用它,以后将来更改。
由于
答案 0 :(得分:2)
如果它有帮助,元素将始终处于相同的顺序,但我希望避免使用它,以后它将被更改。
从您的示例中,排序似乎是唯一对相关元素进行分组的元素 - 从一个effectiveStartTime
到第一个cancellationRefund
的元素序列构成一个组,下一个组从下一个组开始{ {1}}等等。
如果您知道字段名称的集合是固定的,我想假设另一种解释,就是迭代一个特定字段名称的所有实例,然后按位置拉出相关字段,即< / p>
effectiveStartTime
因此对于 n th <xsl:for-each select="field[@name='Agreement_Role:addonSection.effectiveStartTime']">
<xsl:variable name="pos" select="position()" />
<addon>
<effectiveStart><xsl:value-of select="."/></effectiveStart>
<effectiveEnd>
<xsl:value-of select="
../field[@name='Agreement_Role:addonSection.effectiveEndTime'][$pos]" />
</effectiveEnd>
<!-- and so on for the other field names -->
</addon>
</xsl:for-each>
,您需要提取 n effectiveStartTime
等。这样就可以显示字段任何交错,只要同名字段之间的排序是一致的,例如
effectiveEndTime
会得到相同的结果。