Замена всех совпадающих узлов в 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. Что я сделал не так?
1 ответ
Шон говорит, что если вы удалите пространство имен из вашего XML-документа, XSLT будет работать
<Window>
<StackPanel>
<Button/>
</StackPanel>
</Window>
производит...
<Window>
<StackPanel>
<AnotherButton />
</StackPanel>
</Window>
Кроме того, вы спросили, можете ли вы сохранить свое пространство имен
Добавьте свой x:
пространство имен для вашей кнопки...
<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>