XSL:如何用条件连接节点?

时间:2011-08-04 11:56:24

标签: xslt foreach

我有以下代码(例如):

<response>
  <parameter>
    <cottage>
      <cot>
       <res>
        <hab desc="Lakeside">
          <reg cod="OB" prr="600.84>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#</lwz>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120830#20120831#EU#3-0#</lwz>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120831#20120901#EU#3-0#</lwz>

我需要创建一个连接字符串,其中包含整个第一个'lwz'行,然后是每个对应行的价格(200.26,但每行可以不同)。

所以输出,用|分隔每一行将是:

TR#2#AB#200.26#0#QB#行#20120829#20120830#EU#3-0#| 200.26 | 200.26

由于

2 个答案:

答案 0 :(得分:0)

您可以使用XPath substring函数从lwz节点数据中选择子字符串。如果您想要更详细的答案,或许提供完整的XML文档和最佳猜测的XSLT

,那么您并没有真正提供有关您的问题的更多详细信息。

答案 1 :(得分:0)

此XSLT 1.0转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="lwz[1]">
     <xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="lwz[position() >1]">
     <xsl:value-of select=
     "concat('&#xA;',
              substring-before(substring-after(substring-after(substring-after(.,'#'),'#'),'#'),'#')
          )
     "/>
 </xsl:template>

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

应用于提供的文本(转换为格式良好的XML文档!!!):

<response>
    <parameter>
        <cottage>
            <cot>
                <res>
                    <hab desc="Lakeside">
                        <reg cod="OB" prr="600.84">
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#</lwz>
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120830#20120831#EU#3-0#</lwz>
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120831#20120901#EU#3-0#</lwz>
                        </reg>
                    </hab>
                </res>
            </cot>
        </cottage>
    </parameter>
</response>

生成想要的正确结果

TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#
200.26
200.26

II XSLT 2.0解决方案

这种转变:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="lwz[1]">
     <xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="lwz[position() >1]">
     <xsl:value-of select=
     "concat('&#xA;', tokenize(.,'#')[4])"/>
 </xsl:template>

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

应用于上述XML文档时,再次生成所需的正确结果。请注意使用标准XPath 2.0函数tokenize()

TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#
200.26
200.26