首页 > 解决方案 > XSLT 用点分隔字符转换字符串

问题描述

我正在使用 XSLT 来转换 XML。我想initials用点分割节点的字符:

我需要更改以下内容initials

  1. 每个字符由一个点分隔
  2. 大写每个字符
  3. 删除空格

如果它们不存在,我找不到分割字符并插入 DOTS 的方法。

<?xml version="1.0" encoding="UTF-8"?>
<jsonObject>
    <account>
        <initials>ABC</initials>
    </account>
    <account>
        <initials>A BC</initials>
    </account>
    <account>
        <initials>A.B.C  </initials>
    </account>
    <account>
        <initials>a.B.C</initials>
    </account>
</jsonObject>

我想要转换后的以下输出:

<results>
   <account>
      <field name="initials">A.B.C</field>
   </account>
   <account>
      <field name="initials">A.B.C</field>
   </account>
   <account>
      <field name="initials">A.B.C</field>
   </account>
   <account>
      <field name="initials">A.B.C</field>
   </account>
</results>

到目前为止我的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/*">
        <results>
            <xsl:for-each select="account">
                <account>
                    <field name="initials"><xsl:value-of select="upper-case(translate(initials, ' ',''))"/></field>
                </account>
            </xsl:for-each>
        </results>
    </xsl:template>

</xsl:stylesheet>

标签: xslt-2.0

解决方案


我找到了一个解决方案:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:functx="http://www.functx.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:function name="functx:chars" as="xs:string*" xmlns:functx="http://www.functx.com">
        <xsl:param name="arg" as="xs:string?"/>

        <xsl:sequence select="
            for $ch in string-to-codepoints($arg)
            return codepoints-to-string($ch)
            "/>

    </xsl:function>

    <xsl:template match="/*">
        <results>
            <xsl:for-each select="account">
                <account>
                    <field name="initials"><xsl:value-of select="string-join(functx:chars(upper-case(translate(translate(initials, '.',''), ' ',''))), '.')"/></field>                    
                </account>
            </xsl:for-each>
        </results>
    </xsl:template>

</xsl:stylesheet>

推荐阅读