拆分以逗号分隔的变量,并对每个变量执行操作



我正在使用XSLT v1.0并通过Microsoft Visual Studio运行它。

我有数据(每个节点都不同),但结构如下:

<ItemGroupData ItemGroupOID="DDG4">
   <ItemDataString ItemOID="DDLOCC" AuditRecordID="AR.8452551">5,8,9,2,3</ItemDataString>
   <ItemDataString ItemOID="DDLOCL" AuditRecordID="AR.8452551">1,7</ItemDataString>
   <ItemDataString ItemOID="DDLOCR" AuditRecordID="AR.8452551">1</ItemDataString>
</ItemGroupData>

在 3 个字段中,每个字段中都可以有任意数量的值,用逗号分隔。

我正在尝试拆分数据,以便我可以处理每个单独的整数,并尝试了 Dimitre Novatchev 在这里建议的方法:xslt 1.0 中的拆分函数,但它一直给我错误:

"'模板'不是公认的扩展元素。在 (0,0) 处发生错误。

我创建的新拆分/标记模板位于我的整个模板中,该模板用于将我的 XML 转换为 CSV 文件。

我可以在模板中有一个模板吗?还是我需要在主模板之外定义它?有点N00b与XML,所以任何帮助将不胜感激。

我的新模板(请注意,出于演示目的,processedItem位已简化):

    <xsl:template match="mark">
      <xsl:variable name="vrtfSplit">
        <xsl:apply-templates/>
      </xsl:variable>
    <xsl:for-each select="ext:node-set($vrtfSplit)/*">
      <processedItem>
        <xsl:if test="$varLOCOID='DDLOCL'">
          <xsl:value-of select="current() * 100"/>
        </xsl:if>
        <xsl:if test="$varLOCOID='DDLOCC'">
          <xsl:value-of select="current() * 10"/>
        </xsl:if>
        <xsl:if test="$varLOCOID='DDLOCR'">
          <xsl:value-of select="current() * 150"/>
        </xsl:if>
      </processedItem>
    </xsl:for-each>
    </xsl:template>
    <xsl:template match="text()" name="split">
      <xsl:param name="pText" select="."/>
      <xsl:if test="string-length($pText) > 0">
        <item>
          <xsl:value-of select="substring-before(concat($pText, ','), ',')"/>
        </item>
        <xsl:call-template name="split">
          <xsl:with-param name="pText" select="substring-after($pText, ',')"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>

考虑以下示例:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/ItemGroupData">
    <output>
        <xsl:apply-templates/>
    </output>
</xsl:template>
<xsl:template match="ItemDataString">
    <items>
        <xsl:call-template name="tokenize-and-process">
            <xsl:with-param name="text" select="."/>
            <xsl:with-param name="factor">
                <xsl:choose>
                    <xsl:when test="@ItemOID='DDLOCL'">100</xsl:when>
                    <xsl:when test="@ItemOID='DDLOCC'">10</xsl:when>
                    <xsl:when test="@ItemOID='DDLOCR'">150</xsl:when>
                </xsl:choose>
            </xsl:with-param>               
        </xsl:call-template>
    </items>
</xsl:template>
<xsl:template name="tokenize-and-process">
    <xsl:param name="text"/>
    <xsl:param name="factor" select="1"/>
    <xsl:param name="delimiter" select="','"/>
    <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
    <item>
        <xsl:value-of select="$token * $factor"/>
    </item>
    <xsl:if test="contains($text, $delimiter)">
        <!-- recursive call -->
        <xsl:call-template name="tokenize-and-process">
            <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            <xsl:with-param name="factor" select="$factor"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>

应用于示例输入 XML,结果将是:

结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <items>
    <item>50</item>
    <item>80</item>
    <item>90</item>
    <item>20</item>
    <item>30</item>
  </items>
  <items>
    <item>100</item>
    <item>700</item>
  </items>
  <items>
    <item>150</item>
  </items>
</output>

附言:不可以,一个模板不能是另一个模板的子模板。

相关内容

  • 没有找到相关文章

最新更新