xslt 1.0中的拆分功能无效

时间:2016-01-26 19:57:54

标签: xml xslt

我有以下xml

<?xml version="1.0" encoding="utf-8"?>
<Root>
                     <Number>2</Number>
                     <Vehicle>
                        <V4Code>PP03340105</V4Code>
                        <SourceCode>PP03340105</SourceCode>
                        <DRCCode>PP03340105</DRCCode>
                        <OptionalCode1>ANDREA WILLIAM|DWIGHT ROBINSON|04</OptionalCode1>

                     </Vehicle>
                  </Root>

尝试使用下面给出的方法进行拆分

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

 <xsl:template match="text()" name="split">
  <xsl:param name="pText" select="Root/OptionalCode1"/>
  <xsl:if test="string-length($pText)">
   <xsl:if test="not($pText=.)">
    <br />
   </xsl:if>
    <xsl:element name ="Name1">
   <xsl:value-of select=
    "substring-before(concat($pText,'|'),'|')"/>
     </xsl:element>
   <xsl:call-template name="split">
    <xsl:with-param name="pText" select=
     "substring-after($pText, '|')"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

输出就是这样:

<?xml version="1.0" encoding="UTF-8"?>

Anyhelp非常感谢。我不确定我犯了什么错误。由于我是这个xslt的新手,不知道如何找到我犯错的行。

输出应为

<Root>
<List1>Andrea William</List1>
<List2>Dwight Robinson</List2>
</Root>

1 个答案:

答案 0 :(得分:1)

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

    <xsl:template match="Root">
        <xsl:copy>
            <xsl:call-template name="split">
                <xsl:with-param name="pText" select="Vehicle/OptionalCode1"/>
            </xsl:call-template>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()" name="split">
        <xsl:param name="pText" />
        <xsl:param name="level" select="1"/>
        <xsl:if test="string-length($pText)">
            <!--We don't want numeric-only values in our list -->
            <xsl:if test="translate($pText, '0123456789', '')">
                <!--use the level to construct an incrementing List element name -->
                <xsl:element name ="List{$level}">
                    <xsl:value-of select=
                        "substring-before(concat($pText,'|'),'|')"/>
                </xsl:element>
            </xsl:if>
            <xsl:call-template name="split">
                <xsl:with-param name="pText" select=
                    "substring-after($pText, '|')"/>
                <!--increment the level, used to construct List element names -->
                <xsl:with-param name="level" select="$level + 1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>