2014-11-13 4 views
3

Сегодня я действительно борюсь с XSLT, это было долгое время, когда я должен был его использовать. Мне нужно отредактировать xml, и я не могу использовать XSLT 2.0. Поэтому я должен использовать 1.0. Xml im struugling with is (базовый пример):XML-преобразование с XSLT 1

Я попытался создать шаблон для двух узлов, а затем «вызвать» этот шаблон для создания нового узла с нужными значениями, но это тоже не работает, если кто-то может указать мне в правильном направлении.

<messagemap> 
 
    <author> 
 
     <au_id>274-80-9391</au_id> 
 
     <au_lname>Straight</au_lname> 
 
     <au_fname>Dean</au_fname> 
 
     <phone>415 834-2919</phone> 
 
     <address>5420 College Av.</address> 
 
     <city>Oakland</city> 
 
     <state>CA</state> 
 
     <zip>94609</zip> 
 
     <contract>1</contract> 
 
    </author> 
 
</messagemap>

XM:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
    <xsl:output indent="yes"/> 
 
    <!--Identity Transform.--> 
 
    <xsl:template match="node()|@*"> 
 
     <xsl:copy> 
 
      <xsl:apply-templates select="node()|@*"/> 
 
     </xsl:copy> 
 
    </xsl:template> 
 
    
 
    <xsl:template match="au_fname | au_lname"> 
 
     <company> 
 
      <xsl:value-of select="."/> 
 
     </company> 
 
    </xsl:template>  
 
</xsl:stylesheet>

Что я получить в результате:

<messagemap> 
 
    <author> 
 
     <au_id>274-80-9391</au_id> 
 
     <company>Straight</company> 
 
     <company>Dean</company> 
 
     <phone>415 834-2919</phone> 
 
     <address>5420 College Av.</address> 
 
     <city>Oakland</city> 
 
     <state>CA</state> 
 
     <zip>94609</zip> 
 
     <contract>1</contract> 
 
    </author> 
 
</messagemap>

Что мне нужно, это:

<messagemap> 
 
    <author> 
 
     <au_id>274-80-9391</au_id> 
 
     <company>Dean Straight</company> 
 
     <phone>415 834-2919</phone> 
 
     <address>5420 College Av.</address> 
 
     <city>Oakland</city> 
 
     <state>CA</state> 
 
     <zip>94609</zip> 
 
     <contract>1</contract> 
 
    </author> 
 
</messagemap>

ответ

3

Вы можете попробовать соответствие au_fname и строительство company. Затем вы можете удалить au_lname.

XSLT 1,0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="au_fname"> 
     <company> 
      <xsl:value-of select="normalize-space(concat(.,' ',../au_lname))"/> 
     </company> 
    </xsl:template> 

    <xsl:template match="au_lname"/> 

</xsl:stylesheet> 
+0

Какой witchcraftis этого! Действительно, все было так просто. В любом случае, спасибо. У меня только вопрос о том, что concat делает первый «.», Тогда равен au_fname? Остальное очень ясно. – JonathanRomer

+1

@ JonathanRomer - Тебе очень рады. Да, '.' - это текущий контекст, который является' au_fname'. Кроме того, было добавлено 'normalize-space()', чтобы урезать конечное пространство, которое будет добавлено 'concat()' if '../ au_lname' не существовало. –

+0

Вы предоставляете случай, когда отсутствует имя au_lname, но не учитывайте, что au_fname не существует (как узел, а не как значение). –

Смежные вопросы