2014-09-24 4 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. Очевидно, что xslt у меня не работает, как хотелось бы. Он не добавляет поле Id в поле srccontractid. Спасибо заранее.

ответ

1

Проблема с вашим кодом контексте. В точке, где вы определяете переменную:

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

Вы внутри шаблона, который соответствует PriceBasis элементов. Это означает, что контекст этого определения переменной является конкретным элементом PriceBasis. Но, по-видимому, элемент PriceBasis не имеет дочернего элемента Id.

Вместо этого Id является дочерним элементом FRA. В этом контексте, правильный путь к 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 Input

Ваш вклад не хорошо сформирован и не будет принятый любым XML-приложением.Если предположить, что следующий вход, где Fra элемент снова закрыт:

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

XML Output

<?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, и только рука напечатала его, следовательно, ошибки. Ваше решение сработало. Я не понимал, что контекст необходим. –

+0

@ rk540 Добро пожаловать. Пожалуйста, подумайте о том, чтобы принять ответ, который вы нашли, был наиболее полезным. –

0

Во-первых, ваш шаблон соответствует FRA/PriceBasis, которого нет на входе. Похоже, вы хотите сравнить только FRA.

Во-вторых, вы создаете узел Update под своим узлом ModifyMktData, который не находится в вашем желаемом выходе, как указано выше.

Кроме того, что вы делаете, похоже, что он должен работать.

+0

Похоже ошибка в моей копии пасты XML. Исправление. Благодарю. Xslt по какой-то причине не работает, я не знаю, почему. В конце концов я получаю следующее: –

+0

Похоже, вы все еще не скопировали все правильно. Если ваш шаблон совпадает с 'FRA/PriceBasis', он должен создать узел' ModifyMktData' внутри 'PriceBasis', который не является тем, что вы показываете в своем выпуске. Я думаю, что если вы согласитесь на 'FRA' вместо' FRA/PriceBasis', вы получите желаемый результат. – GentlePurpleRain

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