2016-03-23 7 views
0

У меня есть переменная 'temperatureQualifier', тип которой является массивом. Мне нужно прочитать эту переменную массива и извлечь каждое значение из массива и использовать его в моем XSLT.извлечь значение из массива в xslt

Пример ввода XML является

<document> 
<item> 
    <gtin>1000909090</gtin> 
    <flex> 
     <attrGroupMany name="tradeItemTemperatureInformation"> 
      <row> 
       <attr name="temperatureQualifier">[10, 20, 30, 40]</attr> 
      </row> 

     </attrGroupMany> 
    </flex> 
</item> 
</document> 

Желаемая Вывод XML должен быть

<?xml version="1.0" encoding="UTF-8"?> 
<CatalogItem> 
<RelationshipData> 
    <Relationship> 
    <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType> 
    <RelatedItems> 
     <Attribute name="code"> 
      <Value>10</Value> 
     </Attribute> 
     <Attribute name="code"> 
      <Value>20</Value> 
     </Attribute> 
     <Attribute name="code"> 
      <Value>30</Value> 
     </Attribute> 
     <Attribute name="code"> 
      <Value>40</Value> 
     </Attribute> 
    </RelatedItems> 
    </Relationship> 
</RelationshipData> 
</CatalogItem> 

Я использую ниже XSLT, но это дает мне все значения только 1 узел.

<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 


<xsl:template match="document"> 
    <CatalogItem> 
     <RelationshipData> 
      <Relationship> 
       <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType> 
       <RelatedItems>  


        <xsl:for-each select="item/flex/attrGroupMany[@name ='tradeItemTemperatureInformation']/row">      

         <Attribute name="code"> 
          <Value> 
           <xsl:value-of select="attr[@name='temperatureQualifier']"/> 
          </Value> 
         </Attribute> 


        </xsl:for-each> 
       </RelatedItems> 
      </Relationship> 
     </RelationshipData> 
    </CatalogItem> 

</xsl:template> 

</xsl:stylesheet> 

Примечание: Количество значение в массиве может быть равно 1 или более 1. Пример для массива одно значение [10]

Пример для массива multie значение равно [10, 20, 30, 40]

+0

Вы меченый это XSLT-2,0, но вы на самом деле можете использовать процессор XSLT 2.0? Если это так, вы сможете использовать функцию «tokenize». –

ответ

1

С XST 1.0 вы можете использовать рекурсивный раскол:

<xsl:template name="split"> 
<xsl:param name="str" select="."/> 
    <xsl:choose> 
    <xsl:when test="contains($str, ',')"> 
     <Attribute name="code"> 
     <Value> 
     <xsl:value-of select="normalize-space(substring-before($str, ','))"/> 
     </Value> 
     </Attribute> 
     <xsl:call-template name="split"> 
     <xsl:with-param name="str" select="substring-after($str, ',')"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <Attribute name="code"> 
     <Value> 
      <xsl:value-of select="$str"/> 
     </Value> 
     </Attribute> 
    </xsl:otherwise> 
    </xsl:choose> 

</xsl:template> 

И называют это:

  <xsl:call-template name="split"> 
      <xsl:with-param name="str" select="substring-before(
               substring-after(
               attr[@name='temperatureQualifier'], '[') 
               ,']')"/> 
      </xsl:call-template> 
+0

Отличный !! это сработало .. спасибо – Victor

0

Используя последнюю версию Saxon вы могли бы попробовать XSLT 3.0 и

    <xsl:for-each 
         select="item/flex/attrGroupMany[@name = 'tradeItemTemperatureInformation']/row/attr[@name = 'temperatureQualifier']/json-to-xml(.)//*:number"> 

         <Attribute name="code"> 
          <Value> 
           <xsl:value-of select="."/> 
          </Value> 
         </Attribute> 


        </xsl:for-each> 
+0

Извините !! Я забыл утверждать, что это было для версии 1.0. В любом случае это решение может помочь другим .. Спасибо. – Victor

Смежные вопросы