如何在XSLT 1.0中实现SPLIT功能

发布于 2024-10-21 09:48:11 字数 523 浏览 1 评论 0原文

我有以下场景。我有一个 TEAM-MEMBERS 节点,其名称格式为“姓氏,名字”,

<TEAM-MEMBER><LONG-NAME>Last Name, First Name</LONG-NAME></TEAM-MEMBER>

我想将其转换为

<CONTACT><FIRSTNAME>First Name</FIRSTNAME><LASTNAME>Last Name</LASTNAME></CONTACT>

基本上我想按 拆分 节点的值,

我如何使用 XSLT 1.0 实现此目的

此 XSLT 将由 BizTalk Server 使用,因此我只寻找一些 XSLT 1.0 解决方案

谢谢

Karthik

I have a following scenario. I have a TEAM-MEMBERS node which has name in the format last name, first name

<TEAM-MEMBER><LONG-NAME>Last Name, First Name</LONG-NAME></TEAM-MEMBER>

I want to transform this to

<CONTACT><FIRSTNAME>First Name</FIRSTNAME><LASTNAME>Last Name</LASTNAME></CONTACT>

Basically i want to split the <LONG-NAME> node's value by ,

How can I achieve this using XSLT 1.0

This XSLT will be consumed by BizTalk Server hence i am looking for some XSLT 1.0 solutions only

Thanks

Karthik

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉南桥 2024-10-28 09:48:11

这是一个完整的 XSLT 1.0 解决方案,它使用通用的“拆分”模板,将字符串拆分为多个子字符串,并提供分隔符来指定子字符串之间的边界:

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

 <xsl:template match="TEAM-MEMBER">
  <xsl:variable name="vrtfSplitWords">
   <xsl:call-template name="split">
    <xsl:with-param name="pText" select="."/>
   </xsl:call-template>
  </xsl:variable>

  <xsl:variable name="vSplitWords"
  select="ext:node-set($vrtfSplitWords)/*"/>

  <CONTACT>
   <FIRSTNAME><xsl:value-of select="$vSplitWords[2]"/></FIRSTNAME>
   <LASTNAME><xsl:value-of select="$vSplitWords[1]"/></LASTNAME>
  </CONTACT>
 </xsl:template>

 <xsl:template name="split">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pDelim" select="', '"/>
  <xsl:param name="pElemName" select="'word'"/>

  <xsl:if test="string-length($pText)">
   <xsl:element name="{$pElemName}">
    <xsl:value-of select=
     "substring-before(concat($pText,$pDelim),
                       $pDelim
                      )
     "/>
   </xsl:element>

   <xsl:call-template name="split">
    <xsl:with-param name="pText" select=
    "substring-after($pText,$pDelim)"/>
    <xsl:with-param name="pDelim" select="$pDelim"/>
    <xsl:with-param name="pElemName" select="$pElemName"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档:

<TEAM-MEMBER><LONG-NAME>Last Name, First Name</LONG-NAME></TEAM-MEMBER>

生成所需的正确结果

<CONTACT>
   <FIRSTNAME>First Name</FIRSTNAME>
   <LASTNAME>Last Name</LASTNAME>
</CONTACT>

II.使用 FXSL 的解决方案

此转换使用 FXSL 中的 str-split-to-words 模板:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 exclude-result-prefixes="ext"
>
  <xsl:import href="strSplit-to-Words.xsl"/>
  <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:strip-space elements="*"/>
   <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:param name="pmaxLines" select="10"/>

    <xsl:template match="/">
      <xsl:variable name="vwordNodes">
        <xsl:call-template name="str-split-to-words">
          <xsl:with-param name="pStr" select="/"/>
          <xsl:with-param name="pDelimiters"
                          select="',()'"/>
        </xsl:call-template>
      </xsl:variable>

      <xsl:apply-templates select=
       "ext:node-set($vwordNodes)/*[normalize-space()]"/>

    </xsl:template>

    <xsl:template match="word[normalize-space()][1]">
      <FIRSTNAME>
       <xsl:value-of select="normalize-space()"/>
      </FIRSTNAME>
    </xsl:template>

    <xsl:template match="word[normalize-space()][2]">
      <MIDNAME>
       <xsl:value-of select="normalize-space()"/>
      </MIDNAME>
    </xsl:template>

    <xsl:template match="word[normalize-space()][last()]">
      <LASTNAME>
       <xsl:value-of select="normalize-space(.)"/>
      </LASTNAME>
    </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时(变得更加复杂):

<TEAM-MEMBER><LONG-NAME>First Name, (Jr.), Last Name</LONG-NAME></TEAM-MEMBER>

< strong>生成了想要的正确结果:

<FIRSTNAME>First Name</FIRSTNAME>
<MIDNAME>Jr.</MIDNAME>
<LASTNAME>Last Name</LASTNAME>

请注意

str-split-to-words 模板接受多个分隔符。因此,在此转换中使用的分隔符为:',''('')'

Here is a complete XSLT 1.0 solution that uses a general "split" template that splits a string into multiple substrings, provided a delimiter to designate the boundary between substrings:

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

 <xsl:template match="TEAM-MEMBER">
  <xsl:variable name="vrtfSplitWords">
   <xsl:call-template name="split">
    <xsl:with-param name="pText" select="."/>
   </xsl:call-template>
  </xsl:variable>

  <xsl:variable name="vSplitWords"
  select="ext:node-set($vrtfSplitWords)/*"/>

  <CONTACT>
   <FIRSTNAME><xsl:value-of select="$vSplitWords[2]"/></FIRSTNAME>
   <LASTNAME><xsl:value-of select="$vSplitWords[1]"/></LASTNAME>
  </CONTACT>
 </xsl:template>

 <xsl:template name="split">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pDelim" select="', '"/>
  <xsl:param name="pElemName" select="'word'"/>

  <xsl:if test="string-length($pText)">
   <xsl:element name="{$pElemName}">
    <xsl:value-of select=
     "substring-before(concat($pText,$pDelim),
                       $pDelim
                      )
     "/>
   </xsl:element>

   <xsl:call-template name="split">
    <xsl:with-param name="pText" select=
    "substring-after($pText,$pDelim)"/>
    <xsl:with-param name="pDelim" select="$pDelim"/>
    <xsl:with-param name="pElemName" select="$pElemName"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the provided XML document:

<TEAM-MEMBER><LONG-NAME>Last Name, First Name</LONG-NAME></TEAM-MEMBER>

the wanted, correct result is produced:

<CONTACT>
   <FIRSTNAME>First Name</FIRSTNAME>
   <LASTNAME>Last Name</LASTNAME>
</CONTACT>

II. Solution using FXSL

This transformation uses the str-split-to-words template from FXSL:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 exclude-result-prefixes="ext"
>
  <xsl:import href="strSplit-to-Words.xsl"/>
  <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:strip-space elements="*"/>
   <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:param name="pmaxLines" select="10"/>

    <xsl:template match="/">
      <xsl:variable name="vwordNodes">
        <xsl:call-template name="str-split-to-words">
          <xsl:with-param name="pStr" select="/"/>
          <xsl:with-param name="pDelimiters"
                          select="',()'"/>
        </xsl:call-template>
      </xsl:variable>

      <xsl:apply-templates select=
       "ext:node-set($vwordNodes)/*[normalize-space()]"/>

    </xsl:template>

    <xsl:template match="word[normalize-space()][1]">
      <FIRSTNAME>
       <xsl:value-of select="normalize-space()"/>
      </FIRSTNAME>
    </xsl:template>

    <xsl:template match="word[normalize-space()][2]">
      <MIDNAME>
       <xsl:value-of select="normalize-space()"/>
      </MIDNAME>
    </xsl:template>

    <xsl:template match="word[normalize-space()][last()]">
      <LASTNAME>
       <xsl:value-of select="normalize-space(.)"/>
      </LASTNAME>
    </xsl:template>
</xsl:stylesheet>

when applied to this XML document (made quite more complex):

<TEAM-MEMBER><LONG-NAME>First Name, (Jr.), Last Name</LONG-NAME></TEAM-MEMBER>

the wanted, correct result is produced:

<FIRSTNAME>First Name</FIRSTNAME>
<MIDNAME>Jr.</MIDNAME>
<LASTNAME>Last Name</LASTNAME>

Do Note:

The str-split-to-words template accepts multiple delimiters. Thus in this transformation the delimiters used are: ',', '(' and ')'

清旖 2024-10-28 09:48:11

您需要一个递归命名模板。幸运的是,它已经被编写:在 http://www.exslt.org< 查找 str:tokenize /a>.

You need a recursive named template. Fortunately it's already been written: look for str:tokenize at http://www.exslt.org.

天煞孤星 2024-10-28 09:48:11

使用 substring-after()substring-before() 来绕过分割

used substring-after() and substring-before() to get around the split

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文