节点集功能的替代方案

Alternative to node-set function

我在编译具有节点集功能的 XSLT 版本时遇到问题。

所以我想找到节点集函数的替代方法。

输入

Input XML
 <?xml version="1.0" encoding="UTF-8"?>
<Input_DT xmlns="http://siemens.com/ad/geb/cartmanagement/1.2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Description>RCBO, 10 kA, 4P, type AC, 30 mA, C-Char, In: 125 A, Un AC: 400 V</Description>
</Input_DT>

XSLT:
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
     xmlns:doc="http://siemens.com/ad/geb/cartmanagement/1.2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:ext="http://exslt.org/common"
     exclude-result-prefixes="i doc"
    extension-element-prefixes="exsl">
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
    
    <xsl:template match="/doc:Input_DT">
        <xsl:variable name="result">
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="doc:Description"/>
            </xsl:call-template>
        </xsl:variable>
    
    
    <xsl:for-each select="ext:node-set($result)/*" >
    <pos><xsl:value-of select="position()"/> </pos>
    <printtokValue>
    <xsl:value-of select="."/> 
    </printtokValue>
    </xsl:for-each>
    
    </xsl:template>
    
    <xsl:template name="tokenize">
        <xsl:param name="text"/>
        <xsl:param name="delimiter" select="','"/>
            <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
            <xsl:if test="$token">
                <Number>
                    <xsl:value-of select="$token"/>
                </Number>
            </xsl:if>
            <xsl:if test="contains($text, $delimiter)">
                <!-- recursive call -->
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
                </xsl:call-template>
            </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>

SAP版本不支持node-set()函数,这里可以不用node-set()写代码吗?

非常感谢

谨致问候, Sateesh N

如果您真的需要,您可以通过让标记化模板完成所有工作并直接写入输出来消除对 node-set() 函数的需要:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://siemens.com/ad/geb/cartmanagement/1.2" 
exclude-result-prefixes="doc">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/doc:Input_DT">
    <root>
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="doc:Description"/>
        </xsl:call-template>
    </root>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="','"/>
    <xsl:param name="i" select="1"/>
    <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
    <xsl:if test="$token">
        <pos>
            <xsl:value-of select="$i"/> 
        </pos>
        <printtokValue>
            <xsl:value-of select="$token"/> 
        </printtokValue>
    </xsl:if>
    <xsl:if test="contains($text, $delimiter)">
        <!-- recursive call -->
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            <xsl:with-param name="i" select="$i + 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

但是我怀疑你真的需要这个。快速 Google 搜索显示 SAP 确实在其自己的命名空间中支持 node-set() 函数 - 请参阅:https://help.sap.com/saphelp_snc700_ehp01/helpdata/en/a8/824c3c66177414e10000000a114084/frameset.htm