объединение элементов с помощью xsl - PullRequest
1 голос
/ 07 октября 2011

У меня есть несколько элементов xml, которые на самом деле ссылаются на один и тот же «объект», они могут иметь одинаковые данные или разные данные.Любой может иметь элементы, которых нет у других.Я хочу, чтобы мой xsl выводил сумму элементов всех этих xml-объектов.Мы не будем беспокоиться о совпадении.Как вы можете слить таким образом, используя XSL?

Пример:

<root>
<object>
<property1>value</property1>
</object>
<object>
<property1>value</property1>
<property2>value</property2>
</object>
...
<object>
<propertyN>value</propertyN>
</object>
</root>

Результат:

<root>
<object>
<property1>value</property1>
<property2>value</property2>
...
<propertyN>value</propertyN>
</object>
</root>

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Этого можно достичь с помощью группировки Меунтиана.

Сначала определите ключ, соответствующий элементу свойства (в данном случае я предполагаю, что все дочерние узлы объекта * 1006)* являются свойствами), используя имя для поиска.

Далее необходимо сопоставить первое вхождение каждого имени свойства, проверив, что оно является первым таким свойством включ поиска

<xsl:apply-templates 
 select="//object/*[generate-id() = generate-id(key('property', local-name())[1])]" />

Затем вы можете просто скопировать такие совпадения.

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="property" match="object/*" use="local-name()"/>

   <xsl:template match="/">
      <object>
         <xsl:apply-templates select="//object/*[generate-id() = generate-id(key('property', local-name())[1])]"/>
      </object>
   </xsl:template>

   <xsl:template match="*">
      <xsl:copy-of select="."/>
   </xsl:template>

</xsl:stylesheet>

При применении к вашему примеру XML, выводвыглядит следующим образом:

<object>
<property1>value</property1>
<property2>value</property2>
<propertyN>value</propertyN>
</object>

В этом случае возвращается только первое вхождение имени свойства.Если вы хотите объединить элементы, вы можете, например, (при условии, что все значения были числовыми), суммировать их

<xsl:template match="*">
  <xsl:copy>
    <xsl:value-of select="sum(key('property', local-name()))" />
  </xsl:copy>
</xsl:template>

Итак, учитывая этот входной XML ....

<root> 
<object> 
<property1>1</property1> 
</object> 
<object> 
<property1>2</property1> 
<property2>3</property2> 
</object> 
... 
<object> 
<propertyN>4</propertyN> 
</object> 
</root> 

Вывод будет ...

<object>
<property1>3</property1>
<property2>3</property2>
<propertyN>4</propertyN>
</object>
1 голос
/ 07 октября 2011

Это преобразование применено к вашему образцу .xml

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"      xmlns:ext="www.foo.com">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<root>
  <object>
    <xsl:for-each select="/root/object//*">
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </object>
</root>
</xsl:template>
</xsl:stylesheet>

Производит этот вывод:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<object>
  <property1>value</property1>
  <property1>value</property1>
  <property2>value</property2>
  <propertyN>value</propertyN>
</object>
</root>

Хотя вы, вероятно, захотите сделать что-то лучше позже, это должно помочь вам.

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