мне нужно продублировать полезные данные 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>
Пожалуйста, подтвердите это. это тоже работает для меня ...