Разделите переменные через запятую и выполните действие с каждым - PullRequest
0 голосов
/ 27 декабря 2018

Я использую 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 полей.

Я пытаюсь разделить данные, чтобы я мог работать с каждым отдельным целым числом, и попробовал метод, предложенный Димитром Новатчевым здесь: функция разделения в xslt 1.0 , но она продолжает выдавать ошибку:

"'template' не является распознанным элементом расширения. Произошла ошибка в (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>

1 Ответ

0 голосов
/ 27 декабря 2018

Рассмотрим следующий пример:

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>

PS Нет, шаблон не может быть дочерним по отношению к другому шаблону.

...