2016-11-29 2 views
1

У меня есть XML, который содержит несколько элементов:XSLT для, каждый всегда имеет только один элемент

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
<element> 
<ip>192.168.188.101</ip> 
</element> 
<element> 
<ip>192.168.188.100</ip> 
</element> 
</data> 

Я хочу, чтобы сделать его в этой структуре:

<SYNCDW> 
<CIDWSet> 
<CI> 
<CINUM>192.168.188.101</CINUM> 
</CI> 
<CI> 
<CINUM>192.168.188.100</CINUM> 
</CI> 
</CIDWSet> 
</SYNCDW> 

Но всегда один элемент обрабатывается, первый, хотя у меня есть для каждого.

Почему я не обрабатываю все остальные элементы, а только первый? Заранее спасибо за помощь

ответ

1

Пара вещей:

  • Внутри xsl:for-each, контекст переключается на элемент, который вы Перебор (в данном случае, /data/element), поэтому, чтобы выбрать ip Элемент вашего XPath относительно от /data/element, что вы «стоите» и просто будет ip. Как у вас было это, он искал бы /data/element/data/element/ip внутри xsl:for-each и не производил бы никаких значений внутри <CINUM>.
  • Вы можете упростить выражения XPath. Если элементы, которые вы адресуете, не привязаны к пространству имен, а не общие соответствия для любого элемента и предиката, соответствующие local-name() и namespace-uri()='', просто используйте упрощенный XPath data/element.
  • Если вы создаете статически известный атрибут xsi:schemaLocation со статически известным значением, просто используйте объявление литерала внутри литерала элемента SyncCIDW.
  • Если вы используете xsl:value-of, он даст строковое значение выбранного узла. Нет необходимости в функции string().

Изменения были применены к таблице стилей:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <SyncCIDW xmlns="http://www.ibm.com/maximo" 
        xsi:schemaLocation="http://www.ibm.com/maximo"> 
      <CIDWSet> 
       <xsl:for-each select="data/element"> 

        <CI> 
         <CINUM> 
          <xsl:value-of select="ip"/> 
         </CINUM> 
        </CI> 

       </xsl:for-each> 
      </CIDWSet> 
     </SyncCIDW> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы