2013-12-11 7 views
0

Я пытаюсь использовать XSLT для преобразования одного документа XML в другой XML-документ.В XSLT, как вы показываете значение дочернего узла в зависимости от значения другого дочернего узла

Оригинальный XML отформатирован так;

<NodeList> 
    <Node> 
     <Type>Commercial</Type> 
     <ContactDetail> 
     <Name>The Shop</Name> 
     <Line01>1 The Lane</Line01> 
     <Line02></Line02> 
     <Line03>London</Line03> 
     <PostCode>SW11AA</PostCode> 
     <TelMobile>07777123456</TelMobile> 
     </ContactDetail> 
    </Node> 
    <Node> 
     <Type>Municiple</Type> 
     <ContactDetail> 
     <Name>Some place</Name> 
     <Line01>1 Hub Lane</Line01> 
     <Line02>PLYMOUTH</Line02> 
     <Line03>DEVON</Line03> 
     <Line04></Line04> 
     <PostCode>PL62BB<</PostCode> 
     <TelMobile></TelMobile> 
     </ContactDetail> 
    </Node> 
<NodeList> 

И мне нужно, чтобы иметь возможность печатать контактные данные NodeList/Node [Type = «Commercial»], но для жизни меня, я не могу найти правильный способ сделать это.

Я думал что-то вроде этого;

<xsl:value-of select="NodeList/Node/[Type='Commercial"]/ContactDetails/Name" /> 

Но, разумеется, «ContactDetails» не является ребенком «Тип».

Может ли кто-нибудь указать мне правильное направление?

ответ

2

Вы были на правильном пути. Удалите косую черту между узлом и вашим состоянием. Таким образом вы выбираете элемент Node, который соответствует условию в скобках.

NodeList/Node[Type="Commercial"]/ContactDetail/Name

Кроме того, условие проверки «Commercial», который даст вам сообщение об ошибке из цитаты, и в конце XPath ищет ContactDetails вместо ContactDetail, который является то, что ваш пример был . Оба эти исправлено в приведенном выше запросе

+0

пока мы придирка, «Municlple» не является слово. –

+0

Спасибо, что слишком долго сбивало меня с ума. Дополнительный слэш, который у меня был до состояния, был опечаткой только в вопросе, но я ошибочно поместил «ContactDetails» в код. – David

+0

Я чувствую себя глупо, но я выучил урок. Спасибо. – David

2

Правильный синтаксис: NodeList/Node[Type='Commercial']/ContactDetails/Name.

0

Если вам необходимо получить доступ неоднократных узлов, вы можете использовать xsl:key, например:.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:key name="nodeTypeKey" match="Node" use="Type" /> 

    <xsl:template match="/"> 
     <xsl:variable name="addressToUse" 
        select="key('nodeTypeKey', 'Commercial')/ContactDetail"> 
     </xsl:variable> 
     <Name><xsl:value-of select="$addressToUse/Name"/></Name> 
     <Tel><xsl:value-of select="$addressToUse/TelMobile"/></Tel> 
     <!-- etc --> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы