Почему для каждого не работает последовательно? - PullRequest
0 голосов
/ 27 марта 2011

Когда я использую

<xsl:for-each select="plm:PLMXML/plm:ProductRevision>

и значение как в

<td><xsl:value-of select="plm:UserData/plm:UserValue[1]/@value"/></td>

следует за веб-страницей, которую я формирую с помощью xsl, работает отлично. Но когда я использую

<xsl:for-each select="plm:PLMXML>

и значение как в

<td>
    <xsl:value-of 
        select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/>
</td>

веб-страница, которую я создаю, больше не создается должным образом.

В первом случае htm выводится так:

<body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd33">
            <th>Category Type</th>
            <th>DS Def. Modified?</th>
            <th>DS Def Verified?</th>
            <th>Designation</th>
            <th>Hazardous</th>
            <th>test column</th>
            <th>Make/Buy</th>
            <th>Packaging</th>
         </tr>
         <tr>
            <td>
               <td></td>
               <td></td>
               <td></td>
               <td></td>
               <td></td>
               <td>Make</td>
               <td></td>
            </td>
         </tr>
         <tr>
            <td>
               <td></td>
               <td></td>
               <td></td>
               <td></td>
               <td></td>
               <td>Make</td>
               <td></td>
            </td>
         </tr>
      </table>
   </body>
</html>

Это так и должно быть. В таблице htm будет две строки. Ниже приводится вывод из второго сценария, в котором все, что я сделал, взяло plm:ProductRevision из значения for-each select и добавило его в начало оператора value-of select. Два должны быть синонимами, не так ли? Вот вывод, когда это будет сделано.

<html xmlns:plm="http://www.plmxml.org/Schemas/PLMXMLSchema" xmlns:plmxml_cl="http://www.plmxml.org/Schemas/PLMXMLClassificationSchema">
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd33">
            <th>Category Type</th>
            <th>DS Def. Modified?</th>
            <th>DS Def Verified?</th>
            <th>Designation</th>
            <th>Hazardous</th>
            <th>test column</th>
            <th>Make/Buy</th>
            <th>Packaging</th>
         </tr>
         <tr>
            <td>
               <td> </td>
               <td> </td>
               <td> </td>
               <td> </td>
               <td> </td>
               <td>Make Make</td>
               <td> </td>
            </td>
         </tr>
      </table>
   </body>
</html>

Пожалуйста, помогите мне понять, почему. Причина, по которой мне нужно сделать второй способ, заключается в том, что у меня есть значения из узлов, которые отличаются от родительского узла plm: PLMXML. Другими словами, у меня есть значения в plm: PLMXML / plm: ProductRevision и в plm: PLMXML / plmxml_cl: ICO, поэтому я хочу использовать

<xsl:for-each select="plm:PLMXML>
<tr>
<td>
    <xsl:value-of
        select="plm:ProductRevision/plm:UserData/plm:UserValue[2]/@value"/>
</td>
<td>
    <xsl:value-of
        select="plmxml_cl:ICO/plmxml_cl:Property[@attributeId='3000011']/plmxml_cl:Value"/>
</td>
</tr>
</for-each>

Однако, как показано выше, он не выводит желаемый код. Все, что кто-либо может сделать, чтобы помочь мне понять это, будет с благодарностью. Если требуется какая-либо дополнительная информация, пожалуйста, сообщите, и я предоставлю ее немедленно. Спасибо!

Ответы [ 3 ]

1 голос
/ 27 марта 2011

В дополнение к правильному ответу @lwburk это поведение вызвано тем фактом, что выводит <xsl:value-of select="someExpression"> только строковое значение первого узла, выбранного с помощью someExpression.

Я предполагаю, что если во втором случае вы замените :

<xsl:value-of          
   select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/> 

с

  <xsl:for-each select=
      "plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value">
      <xsl:value-of select="."/>
  </xsl:for-each>

тогда результат будет точно таким же, как с первым преобразованием.

1 голос
/ 27 марта 2011

Первое выражение зацикливается на каждом plm:PLMXML/plm:ProductRevision, из которых я предполагаю, что у вас есть два (или три). Второе выражение зацикливается на каждом plm:PLMXML, из которых, я полагаю, у вас есть только один (или, может быть, два).

Это не эквивалентные выражения. Они зацикливаются на разные конструкции. Тело for-each будет запускаться один раз для каждого узла в наборе, соответствующем select. Ваши выражения select различны, поэтому количество совпадающих выражений может быть разным независимо от того, что еще включено в тело for-each.

0 голосов
/ 29 марта 2011

Начало вашего второго случая:

plm: ProductRevision / plm: UserData

Выбирает все элементы plm: UserData для всех элементов plm: ProductRevision.

(Похоже, что из этих выходных данных есть два из этих элементов.)

Затем выражение находит первое UserValue во всех этих элементах UserData.

Наконец, атрибуты @value извсе эти элементы UserValue выводятся.

Вот почему вы видите «Make Make» в одном тд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...