В XPath / XSLT 1.0, чтобы выбрать (или сопоставить) элемент, который находится в пространстве имен, вы должны объявить префикс пространства имен и использовать этот префикс в своих выражениях (или шаблонах). Не обманывайтесь тем фактом, что <StackPanel>
и другие элементы не используют префиксы во входном XML. Он использует пространство имен по умолчанию, как определено в объявлении пространства имен по умолчанию:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Таким образом, вам нужно соответствующее объявление в вашей таблице стилей (как вы сделали для пространства имен "mm"), за исключением того, что вам нужно выбрать префикс пространства имен для использования. Подойдет любой префикс (точно так же, как вам не нужно было использовать «мм»).
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
...>
Затем в вашей таблице стилей вам нужно обновить выражения и шаблоны, чтобы использовать выбранный вами префикс ("x
" в моем примере выше):
<xsl:template match="/x:StackPanel">
Причина, по которой вы видите вывод, в том, что ваше шаблонное правило никогда не вызывается (потому что имя не совпадает). Вместо этого вызывается встроенный шаблон правил для каждого из типов узлов XPath. Корневой узел и узлы элемента должны просто обрабатывать дочерние элементы. Для текстовых узлов это копировать их через. Таким образом, поведение, которое вы видите, такое же, как и при работе с любой пустой таблицей стилей (в которой нет шаблонных правил): дамп всех текстовых узлов во входном документе.
Может быть больно иметь префикс каждого теста имени в каждом выражении или шаблоне. Вот почему в XSLT 2.0 появилась функция под названием xpath-default-namespace
, которая позволяет выражениям XPath и шаблонам XSLT использовать пространство имен по умолчанию, как это делают элементы в XML. В этом случае все, что вам нужно изменить, это добавить одну строку:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
...>
Но это только если вы используете процессор XSLT 2.0. (MSXML, например, не поддерживает XSLT 2.0.)
Прежде чем покинуть вас, я вижу еще несколько проблем в вашей таблице стилей (которые вы, без сомнения, обнаружите дальше):
<xsl:value-of select="/tagsTextBox"/>
<xsl:value-of select="/contentTextBox"/>
Начало выражения с «/
» означает «начать с документа / корневого узла». Таким образом, эти выражения ищут элемент документа <tagsTextBox>
и элемент документа <contentTextBox>
соответственно. Исходя из того, что я вижу в вашем образце входного документа, я думаю, что вы хотели написать так:
<xsl:value-of select=".//x:TextBox[@Name = 'tagsTextBox']"/>
<xsl:value-of select=".//x:TextBox[@Name = 'contentTextBox']"/>
Надеюсь, это поможет! Дайте мне знать, если что-то потребует дальнейшего объяснения.