1

如何使用 ; 拆分元素 作为 delimiter.my 的要求如下所示。

输入:

<Element1>C:KEK39519US; U:085896395195; A:K39519US; B:S2345843</Element1>

输出:

<CustItem>KEK39519US</CustItem>

<UNumber>085896395195</UNumber>

<ANumber>K39519US</ANumber>

<BNumber>S2345843</BNumber>

输入每次都不C:KEK39519US; U:085896395195; B:S2345843 一样。C:KEK39519US; A:K39519US; B:S2345843 有时像这样有时像这样U:085896395195; A:K39519US; 有时像这样C:KEK39519US; U:085896395195; A:K39519US;

4

1 回答 1

2

要在 XSLT 1.0 中解决这个问题,您可能需要一个递归调用自身的命名模板。模板将处理第一个分号之前的字符串,并相应地输出元素。然后它会在这个分号之后使用字符串的剩余部分递归调用自己(如果有的话)

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Element1">
      <xsl:call-template name="outputElements">
         <xsl:with-param name="list" select="." />
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="outputElements">
      <xsl:param name="list"/>

      <xsl:variable name="first" select="normalize-space(substring-before(concat($list, ';'), ';'))"/>
      <xsl:variable name="remaining" select="normalize-space(substring-after($list, ';'))"/>

      <xsl:call-template name="createElement">
         <xsl:with-param name="element" select="$first" />
      </xsl:call-template>

      <!-- If there are still elements left in the list, call the template recursively -->
      <xsl:if test="$remaining">
         <xsl:call-template name="outputElements">
            <xsl:with-param name="list" select="$remaining"/>
         </xsl:call-template>
      </xsl:if>
   </xsl:template>

   <xsl:template name="createElement">
      <xsl:param name="element"/>
      <xsl:variable name="elementName">
         <xsl:choose>
            <xsl:when test="substring-before($element, ':') = 'C'">CustItem</xsl:when>
            <xsl:otherwise><xsl:value-of select="concat(substring-before($element, ':'), 'Number')" /></xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <xsl:element name="{$elementName}">
         <xsl:value-of select="substring-after($element, ':')" />
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML 时,将输出以下内容

<CustItem>KEK39519US</CustItem>
<UNumber>085896395195</UNumber>
<ANumber>K39519US</ANumber>
<BNumber>S2345843</BNumber>

请注意在指定每个新元素的名称时使用属性值模板。

于 2013-04-02T12:25:49.143 回答