2016-08-15 97 views
0

我已經編寫了以下xml代碼,這些代碼將作爲輸入並轉到將處理xml代碼以生成xml輸出的xslt腳本:需要執行XML輸入和XSL的輸出以創建XML輸出

XML輸入

<TAB512> 
<WA>f1,f2</WA> 
</TAB512> 
<TAB512> 
<WA>df1,df2</WA> 
</TAB512> 
</DATA> 
<FIELDS> 
<Filed> 
<FIELDNAME>Field1</FIELDNAME> 
</Filed> 
<Filed> 
<FIELDNAME>Field2</FIELDNAME> 
</Filed> 
</FIELDS> 
</Response> 
<FIELDNAME> 在xsl腳本的第一個元素將格式化輸入XML生成XML輸出在 <WA>

第一元件

<TAB512> 
<WA>f1,f2</WA> 
</TAB512> 

我的意思是之前的字段2

XSL腳本

<xsl:template name="WriteRecordNodeTemplate"> 
<xsl:param name="Field" /> 
<xsl:param name="WA" /> 

<Response> 
<xsl:call-template name="StringSplit"> 
<xsl:with-param name="fi" select="$Field" /> 
<xsl:with-param name="w" select="$WA" /> 
</xsl:call-template> 
</Response> 
</xsl:template> 

<xsl:template name="StringSplit"> 
<xsl:param name="fi" /> 
<xsl:param name="w" /> 
<xsl:choose> 
    <xsl:when test="contains($w, ',')"> 
<Record> 
    <xsl:value-of select="$fi" ><xsl:value-of select="substring-before($w, ',')" /></xsl:value-of select="$fi" > 
</Record> 

    <xsl:call-template name="StringSplit"> 
    <xsl:param name="fi" /> 
    <xsl:with-param name="w" select="substring-after($w, ',')" /> 
    </xsl:call-template> 

    </xsl:when> 
    <xsl:otherwise> 
     <!-- if there is no more delimiter values, print out 
the whole string --> 
<Record> 
<xsl:value-of select="$fi" ><xsl:value-of select="$w" /></xsl:value-of select="$fi" > 
</Record> 
    </xsl:otherwise> 
</xsl:choose> 

</xsl:template> 

最後

第一要素 '' 這將是Field 1和之後的元素 ''

需要XML如下輸出:

<TableName> 
<Record> 
<Field1>f1</Field1> 
<Field2>f2</Field2> 
</Record> 
<Record> 
<Field1>df1</Field1> 
<Field2>df2</Field2> 
</Record> 
</TableName> 
+0

請解釋所需轉換的邏輯 - 特別是。字段名稱和數據之間的關係以及決定輸出應具有多少記錄的因素。爲每個領域提供不同的數據也有助於使示例更加清晰。 - 請說明您是否可以使用XSLT 2.0。 –

+0

Data中的第一個WA元素=第一個字段名稱 –

+0

我需要在biztalk腳本中使用functoid使用內嵌xslt調用模板 –

回答

0

我猜你想做的事:

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:variable name="field-names" select="/Response/FIELDS/Filed" /> 

<xsl:template match="/Response"> 
    <TableName> 
     <xsl:for-each select="DATA/TAB512"> 
      <Record> 
       <xsl:call-template name="tokenize"> 
        <xsl:with-param name="text" select="WA"/> 
       </xsl:call-template> 
      </Record> 
     </xsl:for-each> 
    </TableName> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="','"/> 
    <xsl:param name="i" select="1"/> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:if test="$token"> 
      <xsl:element name="{$field-names[$i]/FIELDNAME}"> 
       <xsl:value-of select="$token"/> 
      </xsl:element> 
     </xsl:if> 
     <xsl:if test="contains($text, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
       <xsl:with-param name="i" select="$i + 1"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

適用於以下測試輸入:

的XMl

<Response> 
    <DATA> 
    <TAB512> 
     <WA>a1,b1</WA> 
    </TAB512> 
    <TAB512> 
     <WA>a2,b2</WA> 
    </TAB512> 
    </DATA> 
    <FIELDS> 
    <Filed> 
     <FIELDNAME>ColumnA</FIELDNAME> 
    </Filed> 
    <Filed> 
     <FIELDNAME>ColumnB</FIELDNAME> 
    </Filed> 
    </FIELDS> 
</Response> 

結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<TableName> 
    <Record> 
     <ColumnA>a1</ColumnA> 
     <ColumnB>b1</ColumnB> 
    </Record> 
    <Record> 
     <ColumnA>a2</ColumnA> 
     <ColumnB>b2</ColumnB> 
    </Record> 
</TableName> 

注意,這需要FIELDNAME值是有效的XML名稱。它還假定每個WA元素具有與Filed節點數相同數量的逗號分隔值。

它也假定您的輸入拼寫錯誤Filed如您的示例中所示。

+0

非常感謝,你真了不起 –