2016-03-23 15 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は、私は以下のXSLTを使用していますが、それは私の唯一の1つのノード内のすべての値を与えている

<?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> 

でなければなりません。

<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. 例multie値のアレイのための[10]

例は、配列内の値の数が1であることができるされている[10、20、30、 40]

+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

あなたはこのXSLT-2.0をタグ付けしましたが、あなたが実際にXSLT 2.0プロセッサを使用することができ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

申し訳ありません!私はそれがv1.0のためであったことを忘れていました。とにかく、このソリューションは他人を助けることができます..ありがとう – Victor

関連する問題