用逗号分隔变量,并对每个变量执行一个操作

时间:2018-12-27 00:05:42

标签: visual-studio xslt-1.0

我正在使用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在此处建议的方法:split function in xslt 1.0,但它始终给我错误:

  

““模板”不是可识别的扩展元素。在(0,0)处发生错误。”。

我创建的新的拆分/标记模板位于总体模板内部,该模板用于将XML转换为CSV文件。

我可以在模板中包含一个模板吗?还是我需要在主模板之外定义它?带有XML的N00b,因此非常感谢您的帮助。

我的新模板(请注意,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>

1 个答案:

答案 0 :(得分:1)

考虑以下示例:

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>

P.S。不可以,一个模板不能是另一个模板的子代。