我有数据,看起来像:
<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>
也许有更多正确的决定?
答案 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>
</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,或者一直使用基于位置的记录方案。