2014-09-24 153 views
0

我有以下XMLXSLT使用兄弟節點生成XML

<FRA> 
    <Id>USD Libor Futures</Id> 
    <PriceBasis>EuroDollar</PriceBasis> 
</FRA> 

我想下面的輸出

<FRA> 
     <Id>USD Libor Futures</Id> 
     <PriceBasis>EuroDollar</PriceBasis> 
     <ModifyMktData srcontractid="USD Libor Futures Convexity" optype="add" srctype="Spread" dsttype="Price"/> 
    </FRA> 

我使用下面的XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="FRA/PriceBasis"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    <xsl:variable name="fraid" select="Id"/> 
    <ModifyMktData> 
     <Update srccontractid="{$fraid} Convexity" optype="add" srctype="Spread" dsttype="Price"/> 
    </ModifyMktData> 
    </xsl:template> 
</xsl:stylesheet> 

xslt的輸出如下所示:

<FRA> 
    <Id>USD LIBOR Futures</Id> 
    <PriceBasis>EuroDollar</PriceBasis> 
    <ModifyMktData> 
    <Update srccontractid=" Convexity" optype="add" srctype="Spread" dsttype="Price" /> 
    </ModifyMktData 
</FRA> 

我基本上是想重用ModifyMktData屬性中的Id。顯然,我有xslt不能正常工作,因爲我喜歡它。它不會將Id字段添加到srccontractid字段。 在此先感謝。

回答

1

您的代碼的問題是上下文。在這裏,你定義一個變量點:

<xsl:variable name="fraid" select="Id"/> 

您是符合PriceBasis元素模板中。這意味着這個變量定義的上下文是一個特定的元素。但是,顯然,PriceBasis元素沒有子元素Id

相反,IdFRA的子元素。在此背景下,以Id正確的路徑是:

../Id 

下面的樣式表簡化了代碼,它並沒有使用可變的。對於短至../Id的表達式,我不明白爲什麼你需要一個變量。您可以直接放在路徑表達式的屬性值模板括號內:

{../Id} 

樣式

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="PriceBasis"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    <ModifyMktData> 
     <Update srccontractid="{../Id} Convexity" optype="add" srctype="Spread" dsttype="Price"/> 
    </ModifyMktData> 
    </xsl:template> 

</xsl:stylesheet> 

XML輸入

您的輸入沒有得到很好的形成並不會由任何XML應用程序接受。假設下面的輸入,在此Fra元素被再次關閉:

<FRA> 
    <Id>USD Libor Futures</Id> 
    <PriceBasis>EuroDollar</PriceBasis> 
</FRA> 

XML輸出

<?xml version="1.0" encoding="utf-8"?> 
<FRA> 
    <Id>USD Libor Futures</Id> 
    <PriceBasis>EuroDollar</PriceBasis> 
    <ModifyMktData> 
     <Update srccontractid="USD Libor Futures Convexity" optype="add" srctype="Spread" dsttype="Price"/> 
    </ModifyMktData> 
</FRA> 
+0

謝謝你做到了。我不想發佈我的整個大規模的XML,只是手輸入它,因此錯誤。您的解決方案奏效我沒有意識到上下文是必要的。 – 2014-09-24 18:22:05

+0

@ rk540不客氣。請考慮接受你發現的答案是最有幫助的。 – 2014-09-24 21:03:35

0

首先,您的模板匹配FRA/PriceBasis,這在輸入中不存在。它看起來像只想匹配FRA

其次,您正在ModifyMktData節點下創建一個Update節點,該節點不在您上面列出的所需輸出中。

除此之外,你在做什麼看起來應該工作。

+0

看起來像XML的我的複製粘貼錯誤。糾正它。謝謝。由於某種原因xslt不起作用我不知道爲什麼。輸出結果如下: – 2014-09-24 16:15:04

+0

它看起來像你還沒有正確地複製一切。如果您的模板在FRA/PriceBasis上匹配,它應該在PriceBasis內創建'ModifyMktData'節點,這不是您在輸出中顯示的節點。我想如果你在FRA而不是FRA/PriceBasis上相匹配,你會得到你想要的結果。 – GentlePurpleRain 2014-09-24 17:43:30