Как дублировать элементы xml

мне нужно продублировать полезные данные xml во столько полезных нагрузок xml на основе определенного идентификатора, например, идентификатора пользователя

<ns2:Details xmlns:ns2="ns">
  <ns2:var1>AA0511201143</ns2:var1>
  <ns2:var2>PARCEL</ns2:var2>
  <ns2:var3>04/04/2011</ns2:var3>
  <ns2:var4>Organization</ns2:var4>
  <ns2:UserId>46</ns2:UserId>
  <ns2:UserId>237</ns2:UserId>
</ns2:Details>

. Мне нужны выходные данные, поскольку

<ns2:Details>
  <ns2:var1>AA0511201143</ns2:var1>
  <ns2:var2>PARCEL</ns2:var2>
  <ns2:var3>04/04/2011</ns2:var3>
  <ns2:var4>Organization</ns2:var4>
  <ns2:UserId>46</ns2:UserId>
</ns2:Details>
<ns2:Details>
  <ns2:var1>AA0511201143</ns2:var1>
  <ns2:var2>PARCEL</ns2:var2>
  <ns2:var3>04/04/2011</ns2:var3>
  <ns2:var4>Organization</ns2:var4>
  <ns2:UserId>237</ns2:UserId>
</ns2:Details>

возможно ли это


Обновление: Приведенный ниже ответ работает нормально, но есть небольшая загвоздка, которую я не упомянул. Если идентификатор пользователя тот же и он повторяется, то должны отображаться те же полезные данные xml. Для этого я попробовал следующее, чтобы получить уникальные элементы идентификатора пользователя

<xsl:param name="userId" select="ns0:UserId[generate-id(.)=generate-id(key('k', ns0:UserId)[1])]"/>

, но это не работает, а также попытался использовать вышеупомянутый

..[generate-id(.)=generate-id(key('k', ns0:UserId)[1])] 

на уровне шаблона, также он не работает

Я что-то упустил?

Обновление : Я сделал небольшую модификацию в приведенном выше коде, вместо того, чтобы работать с xsl: param, я использовал его в xsl: apply-template

перед модификацией (предоставлен в качестве ответа мне) после модификации

my ошибка, я использовал ns2: userid вместо "."

полный xsl-код ---


<xsl:output method="xml" indent="yes"/> <xsl:key name="k" match="ns2:UserId" use="text()"/> <xsl:key name="myUserId" match="ns2:UserId" use="."/> <xsl:template match="/"> <ns2:Root> <xsl:apply-templates select="//ns2:Details/ns2:UserId[generate-id(.)=generate-id(key('myUserId', .)[1])]"/> </ns2:Root> </xsl:template>

<xsl:template match="//ns2:Details"> <xsl:param name="userId" select="ns2:UserId"/> <ns2:Details> <xsl:copy-of select="key('k', $userId)[1]"/> <!-- displays UserId values--> <xsl:copy-of select="./*[name() != 'ns2:UserId']"/> <!-- displays other values--> </ns2:Details> </xsl:template>

<xsl:template match="ns2:UserId"> <xsl:apply-templates select=".."> <xsl:with-param name="userId" select="."/> </xsl:apply-templates> </xsl:template>

Пожалуйста, подтвердите это. это тоже работает для меня ...

7
задан 738560 13 July 2011 в 09:10
поделиться