节点集功能的替代方案
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
我在编译具有节点集功能的 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