XSLT 在遇到 "code" 标记时连接标记 "name"
XSLT to concat a tag "name" when an encountered "code" tag is met
我有一个如下所示的 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 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>
我有一个如下所示的 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 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>