2013-10-01 2 views
-1

Я пытаюсь преобразовать XML из следующих действий:Проблемы относительно трансформации XSLT

<entities xmlns="http://ws.wso2.org/dataservice"><entityIds> 
137651b03d18c0efee947f8bda341fb1 
</entityIds> 
<entityIds> 
aa88ce76d454a0135c89bfbd4def62cd 
</entityIds> 
</entities> 

с использованием XSL следующего

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:p="http://ws.wso2.org/dataservice"> 
<xsl:output method="xml" encoding="utf-8" indent="yes"/> 
<xsl:template match="/"> 
<urlDetails> 
<customerId> 

<xsl:value-of select="//p:entityList/p:entity[1]/p:customerId" /> 
</customerId> 
<entityIds> 
<xsl:apply-templates/> 
<xsl:for-each select="//p:entityList/p:entity"> 

<xsl:value-of select="p:entityId" />, 
</xsl:for-each> 
</entityIds> 
</urlDetails> 
</xsl:template> 
</xsl:stylesheet> 

An Я получаю вывод как:

<?xml version="1.0" encoding="utf-8"?> 
<urlDetails xmlns:p="http://ws.wso2.org/dataservice"> 
<customerId/> 
<entityIds> 
137651b03d18c0efee947f8bda341fb1 
aa88ce76d454a0135c89bfbd4def62cd 
</entityIds> 
</urlDetails> 

Как я могу сделать вывод в запятой отдельно:

<?xml version="1.0" encoding="utf-8"?> 
    <urlDetails xmlns:p="http://ws.wso2.org/dataservice"> 
    <customerId/> 
    <entityIds> 
    137651b03d18c0efee947f8bda341fb1 , 
    aa88ce76d454a0135c89bfbd4def62cd 
    </entityIds> 
    </urlDetails> 

Я использовал строку concat и using version2.0. Я использую сепаратор значений, оба не работают. Есть ли какие-либо другие методы?

+0

Ну, входной образец, который вы разместили как элементы с именем 'entities' и' entityIds', но ваши выражения XPath выглядят как '// p: entityList/p: entity' и' p: entityId'. Таким образом, ни один из имен элементов в выражении пути не совпадает с точными именами элементов в выбранном образце. –

+0

По этой причине, я ниспровергаю вопрос. –

ответ

1

Вы пробовали это:

<xsl:for-each select="//p:entityList/p:entity"> 
    <xsl:value-of select="p:entityId" /><xsl:text>,</xsl:text> 
</xsl:for-each> 
1

В XSLT 2.0 вы должны быть в состоянии опускать for-each (т.е. передать весь узел установить в value-of) и использовать separator, например,

<xsl:value-of select="//p:entityList/p:entity/p:entityId" separator=","/> 

Для 1,0 value-of обрабатывает только один узел, в то время, так что вам нужно для-каждого:

<xsl:for-each select="//p:entityList/p:entity/p:entityId"> 
    <xsl:if test="position() &gt; 1">,</xsl:if> 
    <xsl:value-of select="." /> 
</xsl:for-each> 

if гарантирует, что вы не добавить лишнюю запятую перед первого пункта в списке.

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