xslt子串问题

时间:2011-01-20 05:23:06

标签: xslt

我是XSLT的新手。 我有一个输入XML文件,需要显示为不同的输出XML。我正在使用xslt进行转换。  输入XML:

<Row>
<Column>abc.xyz.ijm</Column>
<Row>

输出XML:

<abc>
  <xyz>
    <ijm>String</ijm>
  </xyz>
</abc>

我尝试使用xsl:when with substring-before和substring-after函数,但结果xml并不接近我想要的。 如何知道'。'的最后一次出现。这样就构造了<ijm>String</ijm>,然后是在'。'之前出现的每一个之前找到的单词的结束标记。这样可以添加</xyz> and </abc>,如上面的输出xml所示?

任何代码段都不会赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:0)

此转化

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

 <xsl:template match="Column/text()" name="tokenize">
   <xsl:param name="pText" select="."/>
   <xsl:if test="string-length()">
    <xsl:choose>
      <xsl:when test="not(contains($pText,'.'))">
        <xsl:element name="{$pText}">String</xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="{substring-before($pText,'.')}">
          <xsl:call-template name="tokenize">
            <xsl:with-param name="pText"
              select="substring-after($pText,'.')"/>
          </xsl:call-template>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
   </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档(更正格式正确):

<Row>
    <Column>abc.xyz.ijm</Column>
</Row>

生成想要的正确结果

<abc>
   <xyz>
      <ijm>String</ijm>
   </xyz>
</abc>

<强>解释

  1. 带有停止条件的递归调用命名模板$pText参数是空字符串或不包含句点字符的字符串。

    < / LI>
  2. 中级操作:在“。”之前创建一个名称为子字符串的元素。在第一个句点字符作为参数之后,然后用文本递归调用自己。

  3. 停止操作:创建一个带名称的元素 - 参数中的整个字符串,以及值:字符串"String"