Вопрос заключается в следующем, у меня есть простой XML-файл:перезапись XMLNS ломает XSLT результата
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>
Does not work
</td>
</tr>
</table>
и файл XSL tranformation
<xsl:transform version="1.0" xmlns="http://www.w3.org/TR/html4/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="td">
It works
</xsl:template>
</xsl:transform>
Если «тд» сопоставляется я ожидаю увидеть «Он работает» как результат, определенный шаблоном. Если «td» не сопоставляется, тогда я ожидаю увидеть «Не работает», поскольку шаблоны по умолчанию выводят все значения узлов, не обрабатываемые настраиваемым шаблоном. Результат:
<?xml version="1.0"?>
Does not work
Однако если изменить объявления пространства имен в Xmlns: HTML = "...", то результат меняется.
XML:
<html:table xmlns:html="http://www.w3.org/TR/html4/">
<html:tr>
<html:td>
Does not work
</html:td>
</html:tr>
</html:table>
XSLT:
<xsl:transform version="1.0" xmlns:html="http://www.w3.org/TR/html4/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="html:td">
It works
</xsl:template>
</xsl:transform>
результат:
<?xml version="1.0"?>
It works
Это простой пример, чтобы изолировать проблему, XML, для реального применения обеспечивается стороннее программное обеспечение, переписывание объявления xmlns в xmlns: это не вариант. Мой вопрос: как мне заставить это работать, результат: «Он работает», без изменения xmlns.
Для преобразования Я использую notepad ++ с плагином XML-инструментов, где есть опция преобразования XSL.
Спасибо заранее
Это решает проблему, но я до сих пор не понимаю, почему не префикс ее не работает. Если префикс отсутствует, не будет ли оно по умолчанию объявлять пространство имен, объявленное xmlns, так как нет конфликта с другим пространством имен, я ожидал, что это сработает. – DemanB
@DemanB "* Если префикса нет, не будет ли оно по умолчанию для пространства имен, объявленного xmlns *« Если префикса нет, тогда он будет выбирать элементы в пространстве имен. –
@DemanB Пожалуйста, попробуйте объяснить это еще раз: ваше предположение состоит в том, что в элементах 'xsl: template' пространство имен по умолчанию, объявленное в элементе' xsl: transform', будет применяться к значению атрибута 'select'. Но пространства имен по умолчанию применяются только к элементам XML, никогда к атрибутам и никогда не относятся к значениям атрибутов. Есть функциональность, которая делает это, хотя я не рекомендую в этом случае: ['xpath-default-namespace'] (https://www.ibm.com/developerworks/library/x-xsltmistakes/#list4). Кроме того, он требует XSLT 2.0. –