2013-11-14 56 views
2

將現有的xml修改爲包含標題部分。我試圖將「Header」元素的嵌套子元素「照原樣」複製到另一個xml文件中,但不能。XHtml轉換 - 複製heeder元素的嵌套子元素

的Xml與Header元素:

<?xml version="1.0" encoding="utf-8"?> 
<QuestionText 
    xmlns:t="clr-namespace:Telerik.Windows.Documents.Model;assembly=Telerik.Windows.Documents" 
    xmlns:s="clr-namespace:Telerik.Windows.Documents.Model.Styles;assembly=Telerik.Windows.Documents" 
    xmlns:r="clr-namespace:Telerik.Windows.Documents.Model.Revisions;assembly=Telerik.Windows.Documents" 
    xmlns:n="clr-namespace:Telerik.Windows.Documents.Model.Notes;assembly=Telerik.Windows.Documents" 
    xmlns:th="clr-namespace:Telerik.Windows.Documents.Model.Themes;assembly=Telerik.Windows.Documents" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    **<Header> 
    <t:SubHeader SubHeaderAtt1="valA" SubHeaderAtt2="valB"> 
     <t:SubSubHeader SubSubHeaderAtt1="valX" SubSubHeaderAtt2="valY"> 
     </t:SubSubHeader> 
    </t:SubHeader> 
    <t:SubHeader SubHeaderAtt1="valC" SubHeaderAtt2="valD"> 
     <t:SubSubHeader SubSubHeaderAtt1="valM" SubSubHeaderAtt2="valN"> 
     </t:SubSubHeader> 
    </t:SubHeader> 
    </Header>** 
    <Content> 
    <p ListId="2" xmlns=""> 
     <span StyleName="ss">Item 1</span> 
    </p> 
    <p ListId="2" xmlns=""> 
     <span>Item 2</span> 
    </p> 
    <p ListId="2" xmlns=""> 
     <span>Item 3</span> 
    </p> 
    <p ListId="3" xmlns="" /> 
    </Content> 
</QuestionText> 

XSD複製標題:

<?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" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
    xmlns:t="clr-namespace:Telerik.Windows.Documents.Model;assembly=Telerik.Windows.Documents" 
    xmlns:s="clr-namespace:Telerik.Windows.Documents.Model.Styles;assembly=Telerik.Windows.Documents" 
    xmlns:r="clr-namespace:Telerik.Windows.Documents.Model.Revisions;assembly=Telerik.Windows.Documents" 
    xmlns:n="clr-namespace:Telerik.Windows.Documents.Model.Notes;assembly=Telerik.Windows.Documents" 
    xmlns:th="clr-namespace:Telerik.Windows.Documents.Model.Themes;assembly=Telerik.Windows.Documents"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="QuestionText"> 
    <t:RadDocument> 
     <xsl:copy> 
     <xsl:value-of select="Header/node()"/> 
     </xsl:copy> 
     <t:Section> 
     <!-- Avoided for brevity --> 
     </t:Section> 
    </t:RadDocument> 
    </xsl:template> 
</xsl:stylesheet> 

預期輸出:

<?xml version="1.0" encoding="utf-8"?> 
<t:RadDocument xmlns:t="clr-namespace:Telerik.Windows.Documents.Model;assembly=Telerik.Windows.Documents" 
    xmlns:s="clr-namespace:Telerik.Windows.Documents.Model.Styles;assembly=Telerik.Windows.Documents" 
    xmlns:r="clr-namespace:Telerik.Windows.Documents.Model.Revisions;assembly=Telerik.Windows.Documents" 
    xmlns:n="clr-namespace:Telerik.Windows.Documents.Model.Notes;assembly=Telerik.Windows.Documents" 
    xmlns:th="clr-namespace:Telerik.Windows.Documents.Model.Themes;assembly=Telerik.Windows.Documents" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    <t:SubHeader SubHeaderAtt1="valA" SubHeaderAtt2="valB"> 
    <t:SubSubHeader SubSubHeaderAtt1="valX" SubSubHeaderAtt2="valY"> 
    </t:SubSubHeader> 
    </t:SubHeader> 
    <t:SubHeader SubHeaderAtt1="valC" SubHeaderAtt2="valD"> 
    <t:SubSubHeader SubSubHeaderAtt1="valM" SubSubHeaderAtt2="valN"> 
    </t:SubSubHeader> 
    </t:SubHeader> 
    <t:Section> 
    <!-- Avoided for brevity --> 
    </t:Section> 
</t:RadDocument> 

我將不勝感激,如果任何人能解釋我是什麼缺少或如何解決問題。任何幫助都可以。

回答

1

輸入文檔根元素上的xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"表示QuestionTextHeader元素位於此名稱空間中。因此

<xsl:template match="QuestionText"> 

將不匹配任何東西,Header/node()不會選擇任何內容,因爲XPath 1.0中前綴的元素名稱總是意味着「沒有命名空間」。

您需要將前綴映射到此名稱空間並在XPath表達式中使用它。您可能還想使用copy-of而不是value-of複製標題元素

<?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="xamlp msxsl" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:xamlp="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
    xmlns:t="clr-namespace:Telerik.Windows.Documents.Model;assembly=Telerik.Windows.Documents" 
    xmlns:s="clr-namespace:Telerik.Windows.Documents.Model.Styles;assembly=Telerik.Windows.Documents" 
    xmlns:r="clr-namespace:Telerik.Windows.Documents.Model.Revisions;assembly=Telerik.Windows.Documents" 
    xmlns:n="clr-namespace:Telerik.Windows.Documents.Model.Notes;assembly=Telerik.Windows.Documents" 
    xmlns:th="clr-namespace:Telerik.Windows.Documents.Model.Themes;assembly=Telerik.Windows.Documents"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="xamlp:QuestionText"> 
    <t:RadDocument> 
     <xsl:copy-of select="xamlp:Header/node()"/> 
     <t:Section> 
     <!-- Avoided for brevity --> 
     </t:Section> 
    </t:RadDocument> 
    </xsl:template> 
</xsl:stylesheet> 
+0

非常感謝。有沒有辦法避免使用元素的前綴?我之前使用過xslt,但從未使用前綴。 – teenboy

+0

@teenboy你不必爲元素使用前綴。您只需在stylesheet_中定義一個前綴以用於其XPath表達式和匹配模式。 XPath在名稱空間格式良好的XML上運行,它所關心的是本地名稱和名稱空間URI。原始文檔中使用的前綴(或缺少前綴)和XPath表達式中使用的前綴不必相同,只需將它們映射到各自位置的相同URI即可。 –