开发者

XSL: How to concatenate nodes with conditions?

I have the following code (eg):

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

I need to create a concatenated string that includes the whole of the first 'lwz' line and then the price (200.26, but it can be differe开发者_如何学运维nt in each line) for each corresponding line.

So the output, separating each line with | would be:

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

Thanks


This XSLT 1.0 transformation:

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

when applied on the provided text (converted to a well-formed XML document !!!):

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

produces the wanted, correct result:

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

II XSLT 2.0 solution:

This transformation:

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

when applied on the above XML document, again produces the wanted, correct result. Note the use of the standard XPath 2.0 function tokenize():

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


You can use the XPath substring function to select substrings from your lwz node data. You don't really give much more detail about your problem, if you want a more detailed answer, perhaps provide the full XML document and your best-guess XSLT

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜