2013-05-17 4 views
0

Мне нужно сгруппировать (объединить) те же узлы в моем XML-документе. я нашел подобную тему, где я получил некоторый образец кода, но мой XML является более сложным и скручивается и я должен был бы по-настоящему понять логику синтаксиса следующего кода XSL:Разработка кода XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" /> 
    <xsl:template match="/"> 
    <Groups> 
     <!-- 
     Iterate over a node set containing just one GroupData element for 
     each combination of ID and Key 
     --> 
     <xsl:for-each select="/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1]"> 
     <GroupData> 
      <!-- Copy attributes from the "prototype" GroupData --> 
      <xsl:copy-of select="@*"/> 
      <!-- 
      Copy ItemData children from *all* GroupData elements with matching 
      ID/Key 
      --> 
      <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" /> 
     </GroupData> 
     </xsl:for-each> 
    </Groups> 
    </xsl:template> 
</xsl:stylesheet> 

образец XML код этого XSL является:

<GroupData ID="xxx" Key="4" Temp="yyy"> 
     <ItemData ID="zzz" Value="3"/> 
    </GroupData> 
    <GroupData ID="yyy" Key="4" Temp="yyy"> 
     <ItemData ID="abc" Value="3"/> 
    </GroupData> 
    <GroupData ID="zzz" Temp="yyy"> 
     <ItemData ID="pqr" Value="1982"/> 
    </GroupData> 
    <GroupData ID="zzz" Temp="yyy"> 
     <ItemData ID="tuv" Value="1982"/> 
    </GroupData> 

так что я хотел бы понять код XSL, так что я могу применить его для моего случая.

Может ли кто-нибудь разработать его для меня? И еще раз эти части:

<xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" /> 

и

<xsl:for-each select="/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1]"> 
     <GroupData> 
      <!-- Copy attributes from the "prototype" GroupData --> 
      <xsl:copy-of select="@*"/> 
      <!-- 
      Copy ItemData children from *all* GroupData elements with matching 
      ID/Key 
      --> 
      <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" /> 
     </GroupData> 
     </xsl:for-each> 

ответ

0

<xsl:key name=""/> создает индекс XML-узлы в документе, используя указанное выражение как просмотровый ключ. Это упрощает поиск похожих узлов. В XSL 1.x это основное средство группировки узлов. key(name, key) используется для запроса этого индекса.

В вашем случае

/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1] 

поясню означает: Найти все GroupData узлы, которые приходят в первый индекс для указанного ключа. Это также может быть записано в виде:

/Groups/GroupData[generate-id() = generate-id(key('group-data', concat(@ID, '___', @Key))[1])] 

generate-id() метод создает уникальный идентификатор для любого узла в документе. Это позволяет сравнивать узлы для равенства. Если аргумент не указан, он использует активный узел (.)

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