2012-04-11 1 views
1

Я использую PHP DOMDocument для XSLT трансформации одного XML в другой, и мне нужно использовать дополнительный тег - MyTag в результате документ тег какОпределение пользовательских тегов в трансформации XSLT

<mytag:full-text>...</mytag:full-text> 

определить этот тег я судимое строительство как это:

<xsl:namespace-alias stylesheet-prefix="mytag" result-prefix="mytag"/> 

и поэтому я получаю сообщение об ошибке

Warning: DOMDocument::load() [domdocument.load]: Namespace prefix mytag on full-text is not defined 

что я делаю неправильно?

+0

Вы, кажется, использует «тег» означает как «префикс пространства имен» и «элемент». Первые особенно неточны. Я думаю, что вы сделаете свою работу намного проще для себя и для общения с другими за помощью, если вы изучите основную терминологию XML. Например. см. http://www.cafeconleche.org/books/effectivexml/chapters/00.html – LarsH

ответ

2

Вот полный пример кода, как это сделать:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:mytag="my:tag" exclude-result-prefixes="mytag"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="b"> 
    <b> 
    <mytag:full-text>Some full-text here</mytag:full-text> 
    </b> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется к следующему документу XML:

<a><b/></a> 

разыскиваемый, правильный результат (новый элемент, добавленный под b) производится:

<a> 
    <b> 
     <mytag:full-text xmlns:mytag="my:tag">Some full-text here</mytag:full-text> 
    </b> 
</a> 
+0

это: exclude-result-prefixes = "mytag" отлично работает! – shershen

+0

@shershen: Добро пожаловать. –

1

Попробуйте добавить Xmlns: MyTag = «some_namespace» в корень вашего XSLT, так что вы получите что-то вроде этого

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:mytag="some_namespace"> 
+0

эта ошибка исчезла, но теперь я получаю атрибут xmlns: mytag = "http: // ..." на каждом корневом теге в результате xml document – shershen

+0

Это ожидаемое поведение. Чтобы ваш результат был корректным XML, префикс пространства имен для «mytag» должен быть объявлен где-то в вашем XML-документе, иначе «mytag» не имеет никакого значения. Вы можете вручную добавить его в корневой узел вашего вывода, если вы не хотите, чтобы он был добавлен ко всем дочерним узлам. –

+0

@shershen: Я не знаю, что вы подразумеваете под «корневым тегом» - возможно, начальный тег самого внешнего элемента? В зависимости от того, что вы имеете в виду, вы можете использовать 'exclude-result-prefixes =" * "' элемент 'xsl: stylesheet'. Другой вопрос: почему вы хотите избежать объявления xmlns: mytag для определенных элементов? Это ничего не должно повредить, и некоторые объявления необходимы, если вы собираетесь использовать пространства имен. Если у вас есть объявления пространства имен, которые, по вашему мнению, не нужны и не разрешены префиксами exclude-result-prefixes, просьба сообщить подробности. – LarsH