XSLT在遇到遇到的“代码”标签时,合并标签“名称”

问题描述 投票:0回答:1

我有一个类似以下的XSL:

<flow>
    <info>
        <code>ACC</code>
        <line>1</line>
        <name>ADAM</name>
    </info>
    <info>
        <code>BENEF</code>
        <line>1</line>
        <name>HOM BAK</name>
    </info>
    <info>
        <code>BENEF</code>
        <line>2</line>
        <name>HAB</name>
    </info>
</flow>

和这样的XSL:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="*" />
        </xsl:copy>
    </xsl:template>

   <xsl:template match="flow/info/name">
       <xsl:variable name="pos">
            <xsl:number count="info"/>
       </xsl:variable>

       <xsl:element name="{local-name()}{$pos}">
          <xsl:apply-templates/>
     </xsl:element>
   </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

结果XML是这样的:

<?xml version="1.0" encoding="utf-16"?>
<flow>
    <info>
        <code>ACC</code>
        <line>1</line>
        <name1>ADAM</name1>
    </info>
    <info>
        <code>BENEF</code>
        <line>1</line>
        <name2>HOM BAK</name2>
    </info>
    <info>
        <code>BENEF</code>
        <line>2</line>
        <name3>HAB</name3>
    </info>
</flow>

但是无论何时<code>BENEF,我都需要连接的名称,例如:

    <?xml version="1.0" encoding="utf-16"?>
    <flow>
        <info>
            <code>ACC</code>
            <line>1</line>
            <name1>ADAM</name1>
        </info>
        <info>
            <code>BENEF</code>
            <line>1</line>
            <name2>HOM BAK HAB</name2>
        </info>
        <info>
            <code>BENEF</code>
            <line>2</line>
            <name3>HOM BAK HAB</name3>
        </info>
    </flow>

有人可以帮我吗?谢谢!

xml xslt concat
1个回答
0
投票

我终于做到了这一点-任何其他解决方案都欢迎!谢谢!

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="*" />
        </xsl:copy>
    </xsl:template>

   <xsl:template match="flow/info/name">
       <xsl:variable name="pos">
            <xsl:number count="info"/>
       </xsl:variable>

       <xsl:variable name="currentCode">
           <xsl:for-each select="//flow/info">
               <xsl:if test="$pos = position()">
                   <xsl:value-of select='code'/>
               </xsl:if>
            </xsl:for-each>
       </xsl:variable>

       <xsl:variable name="concatName">
           <xsl:for-each select="//flow/info">
               <xsl:if test="code = 'BENEF'">
                    <xsl:value-of select='name'/>
                    <xsl:if test="position()!=last()">
                        <xsl:text> </xsl:text>
                    </xsl:if>
                </xsl:if>
            </xsl:for-each>
       </xsl:variable>

       <xsl:element name="{local-name()}{$pos}">
           <xsl:choose>
           <xsl:when test="$currentCode!='BENEF'">
                <xsl:apply-templates/>
           </xsl:when>
           <xsl:otherwise>
                <xsl:value-of select="$concatName"/>
          </xsl:otherwise>
          </xsl:choose>
     </xsl:element>
   </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.