2012-08-10 101 views
0

我想替換xml文件中的所有匹配節點。使用XSLT替換XML中的所有匹配節點

要原始的XML:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
    <Button/> 
    </StackPanel> 
</Window> 

我申請以下XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

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

但它產生相同的XML。我做錯了什麼?

+0

**默認命名空間!** – 2012-08-10 08:21:06

+3

您的按鈕是在一個命名空間,但是你的匹配模式說「匹配'按鈕'不在名稱空間中」 - 因此不匹配。 – 2012-08-10 08:22:08

+0

是的,它現在有效。謝謝。有沒有辦法將這些空間添加到xslt中,以使其工作而不從原始xml中刪除名稱空間? – Peter17 2012-08-10 08:35:24

回答

3

什麼肖恩說的是,如果您從您的XML文檔的命名空間的XSLT將工作

<Window> 
    <StackPanel> 
    <Button/> 
    </StackPanel> 
</Window> 

產生...

<Window> 
    <StackPanel> 
     <AnotherButton /> 
    </StackPanel> 
</Window> 

或者,你問,如果你能保留你的名字空間

將你的x:命名空間添加到你的Button ...

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
    <x:Button/> 
    </StackPanel> 
</Window> 

更新您的XSL也使用這個命名空間x:Button

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

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

產生...

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <x:AnotherButton/> 
    </StackPanel> 
</Window>