Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 从不同字段检索数据,其中地标是符号_Xslt - Fatal编程技术网

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

Xslt 从不同字段检索数据,其中地标是符号,xslt,Xslt,我有数据,看起来像: <line id="1"> <field id="1">324</field id="1"> <field id="2">abc</field id="2"> ................................. ................................. ................................. <field id="11">324321

我有数据,看起来像:

<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">

324
abc
.................................
.................................
.................................
324321
324
abc
.................................
.................................
.................................
324321
324fsf
abcdf
.................................
.................................
.................................
32432s1
3fsfa24
abasc
.................................
.................................
.................................
32fasf4321
我需要在地标“+”之前取数字

<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>


也许还有更正确的决定?

在我看来,这是一个糟糕、脆弱的设计。如果要依赖位置逻辑来解析记录,为什么不放弃XML,使用EDI或其他基于记录的格式呢

在这里,您没有使用XML。标记是描述流的元数据。当你去这个设计的时候,你把它弄丢了


我建议以更好的方式使用XML,或者完全使用基于职位的记录方案。

使用
函数之前的
子字符串。您可以使用它来获取第一个
+

我还建议为每个条件使用单独的模板:

<xsl:template match="field[@id='9']">
  <xsl:value-of select="substring-before(../field[@id='10'],'+')" />
</xsl:template>


或类似的内容,具体取决于上下文。

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


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

好问题,+1。请参阅我的答案,以获得完全符合XSLT精神的完整而简短的解决方案。我将尝试使用它。@Dimitre:获得的值并不总是来自匹配的同一字段。例如,第一个
检查是否存在
字段[@id='9']
,但是
@Flynn1179:是的,我注意到了这一点,但没有解释这一点,并且似乎没有逻辑何时获取前一个字段,所以我断定这一定是问题描述中的错误。@Dimitre:+1用于模式匹配。@flyn1179:它可能是“一个
字段
”逻辑。。。但是,同样,在模式中使用所有这些逻辑在语义上更有意义。现在我从所有字段中获取信息,而不仅仅是从字段的符号“+”的位置获取信息。那个么我怎样才能封装这个,显示从那个字段开始获取数据。我并不是不理解你们。但是试着评论一下。对我来说,数据排成一行,解析器将其生成xml,在不同的字段中有数据,这取决于我们在解析之前排成一行的符号的方式。昨天我没有写其他字段也被填充。现在我纠正它,我是说生成您的数据的人在设计他们发送给您的XML方面做得不好。
<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>
<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