XSLT使用兄弟节点生成xml

时间:2014-09-24 15:45:52

标签: xml xslt

我有以下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字段。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码存在问题 context 。在您定义变量的位置:

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

您位于匹配PriceBasis元素的模板中。这意味着此变量定义的上下文是特定的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>

答案 1 :(得分:0)

首先,您的模板匹配FRA/PriceBasis,这在输入中不存在。看起来您只想匹配FRA

其次,您在Update节点下创建了一个ModifyMktData节点,该节点不在上面列出的所需输出中。

除此之外,你所做的事情看起来应该有效。