2010-04-06 4 views
4

Это может быть очень простой вопрос, но его я не могу получить и отрывать свои волосы. У меня есть следующий XML:XSL и пространства имен

<?xml-stylesheet type="text/xsl" href="email.xsl"?> 
<Example xmlns=""> 
    <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> 
</Example> 

И пытаюсь использовать следующий XSLT:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table width="90%" border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
      <td> 
       <p>AUTOMATED CONFIRMATION: This confirmation email is unable to take replies. For further assistance please visit our Help pages or Contact us</p> 
       <p>Dear <xsl:value-of select="Name"/>,</p> 
       <p>Thank you for blah blah... </p> 
      </td> 
      </tr> 
     </table> 
     <xsl:apply-templates/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Я не могу получить имя, которое появляется, когда я использую xmlns=urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1 в кормах XML, когда я удалить xmlns, имя отображается нормально.

Есть ли какой-то синтаксис, который мне не хватает? Я попытался добавить пространство имен к <xsl:stylesheet> элемента:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rpg="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1" 
> 

Затем, используя приставку, которую я дал в XSLT в выражении XPath:

<xsl:value-of select="Name"/> 

Но это не работает. Может ли кто-нибудь помочь? Заранее спасибо.

ответ

0

В качестве альтернативы использовать предикат и информации локального имя(). Например:

<xsl:value-of select="*[local-name() = 'Name']"/> 
+0

Это плохая идея, потому что она не только неэффективна (медленная из-за сравнения строк), но и не учитывает пространства имен, что она действительно должна делать. – Lucero

+1

... Если пространства имен релевантны (если требуется различное поведение для разных пространств имен). Если XSL представляет собой просто форматирование содержимого необработанного XML, которое вас интересует, пространство имен не так актуально и может быть проигнорировано. В примере OP пространство имен * не * предназначено для сохранения в выходном XML только текстовое содержимое элемента. Я не уверен в отношении производительности. Помните, что согласно определениям функции XPath «* [name() = name]» эквивалентно «name»; и в любом случае компилятор может свободно переписывать выражения XPath в эквивалентные для оптимизации. – user268396

+0

+1 Это не плохой или неправильный ответ, который заслуживает отрицательного результата. Это имеет некоторые последствия, но они были названы. Аргумент производительности сильно зависит от того, сколько детей имеет текущий узел и насколько хорошо оптимизирован XSLT-процессор.Аргумент namespace сильно зависит от того, заботитесь вы или нет. ;) – Tomalak

4

Вам нужно использовать одно и то же пространство имен в XSLT, чтобы соответствовать выражению XPath для Name.

<xsl:value-of select="x:Name" xmlns:x="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1"/> 
+2

К сожалению, так мало примеров учебников XSL включают пространства имен, это обычное замешательство. Если есть пространство имен, связанное с элементом, то в отношении XSL его имя является квалифицированным именем (http://en.wikipedia.org/wiki/QName), а не простое имя. –

+0

Это не лучший способ сделать это, потому что объявление пространств имен в 'xsl: value-of' раздувает XSL-код без необходимости. Объявить их на уровне документа - это путь. – Tomalak

+0

@Tomalak, зависит от того, в какой области используется пространство имен. Если он используется только для этого элемента, его использование таким образом позволяет понять, какое пространство имен представляет префикс. Конечно, если пространство имен должно было использоваться в нескольких местах, я бы также переместил его в документ. – Lucero

6

Ваш подход с объявляя имен в <xsl:stylesheet> было правильное направление уже. Теперь все, что вам нужно сделать, это использование префикс также:

<xsl:value-of select="Example/rpg:Name" /> 

Я также рекомендую крошечные изменения в шаблоне, чтобы лучше отразить ввод:

<xsl:template match="Example"> 
    <!-- ... --> 
    <xsl:value-of select="rpg:Name" /> 
</xsl:template> 
Смежные вопросы