2012-05-03 5 views
2

мне нужен XSLT, чтобы преобразовать мой Xml как нижепреобразования XSLT на основе предопределенного вывода строки

<OrderReferences> 
      <OrderRef> 
       <OrderRef>OrderRef1</OrderRef> 
       <Type>ERP</Type> 
      </OrderRef> 
      <OrderRef> 
       <OrderRef>OrderRef2</OrderRef> 
       <Type>CUSTOMER</Type> 
      </OrderRef> 
      <OrderRef> 
       <OrderRef>OrderRef3</OrderRef> 
       <Type>EXT</Type> 
      </OrderRef> 
      </OrderReferences> 

Моего выхода из этого должно быть

<OrderReference> (OrderReference for ERP should appear here) </OrderReference> 
<OrderReferenceCustomer> (CustomerReference for Customer should appear here) </OrderReferenceCustomer> 
<OrderReferenceExternal> (ExtReference for EXT should appear here) </OrderReferenceExternal> 

Позвольте мне знать, если это достижимо. Версия XSLT 1.0 предпочтительна, поскольку я хочу это для .Net. Благодарю.

+0

Где в исходном XML есть ли у вас 'CustomerReference' и' ErpOrderReference'? – Oliver

+0

ErpOrderReference, ErpCustomerReference, ErpExtReference - объекты, в которые я хочу поместить эти данные. Мне нужна xslt что-то вроде этого. KRP

+0

Ну, правильный ответ «да, это достижимо». Вам не кажется, что вы должны попробовать сами и вернуться, если у вас есть конкретная проблема? –

ответ

1

Это короткое и простое преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="OrderRef[Type='ERP']"> 
    <OrderReference><xsl:value-of select="OrderRef"/></OrderReference> 
</xsl:template> 

<xsl:template match="OrderRef[Type='CUSTOMER']"> 
    <OrderReferenceCustomer><xsl:value-of select="OrderRef"/></OrderReferenceCustomer> 
</xsl:template> 

<xsl:template match="OrderRef[Type='EXT']"> 
    <OrderReferenceExternal><xsl:value-of select="OrderRef"/></OrderReferenceExternal> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на поставленном XML документа:

<OrderReferences> 
    <OrderRef> 
     <OrderRef>OrderRef1</OrderRef> 
     <Type>ERP</Type> 
    </OrderRef> 
    <OrderRef> 
     <OrderRef>OrderRef2</OrderRef> 
     <Type>CUSTOMER</Type> 
    </OrderRef> 
    <OrderRef> 
     <OrderRef>OrderRef3</OrderRef> 
     <Type>EXT</Type> 
    </OrderRef> 
</OrderReferences> 

производит точный хотел, правильный результат (в отличие от принятого в настоящее время ответ):

<OrderReference>OrderRef1</OrderReference> 
<OrderReferenceCustomer>OrderRef2</OrderReferenceCustomer> 
<OrderReferenceExternal>OrderRef3</OrderReferenceExternal> 
2

Вы должны использовать в XSL: элемент для создания новых имен элементов на основе типа элемента. Попробуйте XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="OrderRef"> 
     <xsl:element name="Erp{substring(Type, 1, 1)}{translate(substring(Type, 2, string-length(Type) - 1), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')}Reference"> 
     <xsl:value-of select="OrderRef" /> 
     </xsl:element> 
    </xsl:template> 

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

Когда это применяются к вашему образцу XML, следующий выход

<OrderReferences> 
    <ErpErpReference>OrderRef1</ErpErpReference> 
    <ErpCustomerReference>OrderRef2</ErpCustomerReference> 
    <ErpExtReference>OrderRef3</ErpExtReference> 
</OrderReferences> 

Это должно справиться с типом элементов, содержащих какое-либо значение.

+0

Мне нужна xslt для версии «1.0», так как .net не поддерживает такие функции в нижнем регистре. – KRP

+0

Я изменил его как XSLT 1.0. –

+0

Спасибо Тиму за ваши входы, очень полезно. – KRP