2014-09-18 2 views
0

У меня есть фрагмент XML:Простой узел копирования из XML в XML

<?xml version="1.0" encoding="UTF-8"?> 
     <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/" 
     xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/POSLog.xsd"> 
<dtv:PosTransactionProperties> 
<dtv:PosTransactionPropertyCode><![CDATA[RECEIPT_EMAIL_ADDRESS]]></dtv:PosTransactionPropertyCode> 
<dtv:PosTransactionPropertyValue><![CDATA[[email protected]]]></dtv:PosTransactionPropertyValue> 
</dtv:PosTransactionProperties> 
</POSLog> 

И следующий код XSLT, который теперь копирует данные только из конкретных выбранных элементов:

<xsl:stylesheet version="2.0" 
       xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     > 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="//POSLog"> 
<POSLog> 
       <xsl:for-each select = "../dtv:PosTransactionProperties[dtv:PosTransactionPropertyCode='RECEIPT_EMAIL_ADDRESS']/dtv:PosTransactionPropertyValue[string-length() &gt; 0]" > 
       <xsl:copy-of select = "." /> 
      </xsl:for-each> 
</POSLog> 
</xsl:template> 


</xsl:stylesheet>  

Но, на основе по моему требованию, мне нужно скопировать на выходной XML весь узел «dtv: PosTransactionProperties», не могли бы вы посоветоваться, как это сделать.

ответ

0

Что относительно этого?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs dtv" 
version="2.0"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="POSLog" xpath-default-namespace="http://www.nrf-arts.org/IXRetail/namespace/"> 
    <xsl:element name="{name(.)}"> 
     <xsl:apply-templates select="dtv:PosTransactionProperties[dtv:PosTransactionPropertyCode='RECEIPT_EMAIL_ADDRESS']/dtv:PosTransactionPropertyValue[string-length() &gt; 0]"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="dtv:PosTransactionProperties[dtv:PosTransactionPropertyCode='RECEIPT_EMAIL_ADDRESS']/dtv:PosTransactionPropertyValue[string-length() &gt; 0]"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Markup_Fanatic,

Спасибо за вашу помощь, ваш код производится следующим образом:


<POSLog> 
    <dtv:PosTransactionPropertyValue xmlns="http://www.nrf-arts.org/IXRetail/namespace/" 
            xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">[email protected]</dtv:PosTransactionPropertyValue> 
</POSLog> 

Но это не совсем то, что мне нужно, я был в состоянии внесите изменения:


<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs dtv" 
version="2.0"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="dtv:PosTransactionProperties[dtv:PosTransactionPropertyCode='RECEIPT_EMAIL_ADDRESS']/dtv:PosTransactionPropertyValue[string-length() &gt; 0]"> 
     <xsl:copy-of select=".."/> 
</xsl:template> 

</xsl:stylesheet> 

и производится следующим образом:


RECEIPT_EMAIL_ADDRESS 
<dtv:PosTransactionProperties xmlns="http://www.nrf-arts.org/IXRetail/namespace/" 
           xmlns:dtv="http://www.datavantagecorp.com/xstore/" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <dtv:PosTransactionPropertyCode>RECEIPT_EMAIL_ADDRESS</dtv:PosTransactionPropertyCode> 
    <dtv:PosTransactionPropertyValue>[email protected]</dtv:PosTransactionPropertyValue> 
</dtv:PosTransactionProperties> 

, который очень близок к цели, только один вопрос, как избавиться от "RECEIPT_EMAIL_ADDRESS" на верхняя часть, которая является значением элемента

<dtv:PosTransactionPropertyCode>RECEIPT_EMAIL_ADDRESS</dtv:PosTransactionPropertyCode>. 
+0

Вы могли бы попытаться объяснить свой ответ и как (где именно) он решает вопрос? –

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