2009-07-17 3 views
1

Я пытаюсь добавить заголовки мыла в мой документ и обновлять первый узел RS сДобавить заголовок мыла - обновить узел - копия документа

<Rs xmlns="http://tempuri.org/schemas"> 

всего время копирования остальных узлов документа. В моем реальном примере у меня будет больше узлов в родительском узле RS, поэтому я ищу решение с какой-то глубокой копией.

<-- this is the data which needs transforming --> 

<Rs> 
    <ID>934</ID> 
    <Dt>995116</Dt> 
    <Date>090717180408</Date> 
    <Code>9349</Code> 
    <Status>000</Status> 
</Rs> 


<-- Desired Result --> 

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Body> 
    <Rs xmlns="http://tempuri.org/schemas"> 
    <ID>934</ID> 
    <Dt>090717180408</Dt> 
    <Code>9349</Code> 
    <Status>000</Status>  
    </Rs> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

<-- this is my StyleSheet. it's not well formed so i can't exexute it--> 

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
<xsl:template match="/"> 
    <SOAP-ENV:Envelope 
       xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
     <SOAP-ENV:Body> 
        <xsl:apply-templates select = "Rs"> 
        </xsl:apply-templates> 
        <xsl:copy-of select="*"/> 
     </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
</xsl:template> 
<xsl:template match ="Rs"> 
    <Rs xmlns="http://tempuri.org/schemas"> 
</xsl:template> 
</xsl:stylesheet> 

Я читал учебники, но у меня возникли проблемы, когда я обдумывал шаблоны и где их реализовать.

+0

XSL не является тривиальным. Я бы начал с чего-то более простого, если бы был вами. –

ответ

1

xmlns - это не просто еще один атрибут, но означает изменение пространства имен. Так что это немного сложнее. Попробуйте это:

<?xml version='1.0' ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
    <xsl:template match="/"> 
     <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
      <SOAP-ENV:Body> 
       <xsl:apply-templates select="Rs"/> 
      </SOAP-ENV:Body> 
     </SOAP-ENV:Envelope> 
    </xsl:template> 
    <xsl:template match="node()"> 
     <xsl:element name="{local-name(.)}" namespace="http://tempuri.org/schemas"> 
      <!-- the above line is the tricky one. We can't copy an element from --> 
      <!-- one namespace to another, but we can create a new one in the --> 
      <!-- proper namespace. --> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates select="node()|*"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="text()"> 
     <xsl:if test="normalize-space(.) != ''"> 
      <xsl:value-of select="."/> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Некоторые из гимнастики не так уж важен, если вы не используете indent="yes" но я старался, чтобы он соответствовал своему выводу настолько близко, насколько это возможно.

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