从不同的字段中检索数据,其中地标是符号

时间:2011-02-21 12:10:30

标签: xslt

我有数据,看起来像:

<line id="1">
<field id="1">324</field id="1">
<field id="2">abc</field id="2">
.................................
.................................
.................................
<field id="11">324321</field id="11">
<field id="12"
 ><![CDATA[6256812+0000140000000990000000000009900000000004058002C]]></field>
</line id="1">
<line id="2">
<field id="1">324</field id="1">
<field id="2">abc</field id="2">
.................................
.................................
.................................
<field id="8">324321</field id="11">
<field id="9"
 ><![CDATA[6256813+0000040000000890000000000008900000000003648002C]]></field>
</line id="2">
<line id="3">
<field id="1">324fsf</field id="1">
<field id="2">abcdf</field id="2">
.................................
.................................
.................................
<field id="12">32432s1</field id="11">
<field id="13"
 ><![CDATA[6256812+0000060000000750000000000007500000000003074002C]]></field>
</line id="3">
<line id="4">
<field id="1">3fsfa24</field id="1">
<field id="2">abasc</field id="2">
.................................
.................................
.................................
<field id="18">32fasf4321</field id="11">
<field id="19"
 ><![CDATA[6256837+0000010000000650000000000006500000000002664003C]]></field>
</line id="5">

我需要在地标'+'之前取数字。

<xsl:choose>
 <xsl:when test="string(field[@id='9'])">
    <xsl:value-of select="number(substring(field[@id='10'], 1,7))"/>
 </xsl:when>
 <xsl:when test="string(field[@id='11'])">
    <xsl:value-of select="number(substring(field[@id='12'], 1,7))"/>
 </xsl:when>
 <xsl:when test="string(field[@id='17'])">
    <xsl:value-of select="number(substring(field[@id='17'], 1,7))"/>
 </xsl:when>
</xsl:choose>

也许有更多正确的决定?

2 个答案:

答案 0 :(得分:2)

正确的XSLT方式(推送式处理):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>


 <xsl:template match="field[contains('|9|13|19|', concat('|',@id, '|'))]">
  <xsl:value-of select="substring-before(.,'+')"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

将此转换应用于提供的XML文档(通过严重格式错误进行更正):

<t>
    <line id="1">
        <field id="12"><![CDATA[6256812+0000140000000990000000000009900000000004058002C]]></field>
    </line>
    <line id="2">
        <field id="9"><![CDATA[6256813+0000040000000890000000000008900000000003648002C]]></field>
    </line>
    <line id="3">
        <field id="13"><![CDATA[6256812+0000060000000750000000000007500000000003074002C]]></field>
    </line>
    <line id="4">
        <field id="19"><![CDATA[6256837+0000010000000650000000000006500000000002664003C]]></field>
    </line>
</t>

产生了想要的正确结果:

6256813
6256812
6256837

请注意:转换中甚至没有一条条件xslt指令。

答案 1 :(得分:0)

对我来说,这看起来像一个糟糕,脆弱的设计。如果您要依靠位置逻辑来解析记录,为什么不放弃XML并使用EDI或其他基于记录的格式?

你没有在这里使用XML。标签是描述流的元数据。你去参考这个设计时就失去了它。

我建议以更好的方式使用XML,或者一直使用基于位置的记录方案。