Как это значение использует запятую в xsl

xml файл, как показано ниже Я хочу concat значение name, add1, city, add2 с разделенным запятой

<details>
<name>abc</name>
<profile>
<address>
<add1>ccc</add1>
<add2>bbb</add2>
<city>CA</city>
</address>
</profile>
</details>

Я хочу Результат, как показано ниже:

abc, ccc, CA, bbb

(Я имею в виду, что город будет первым до добавления2, и если какое-либо значение будет пустым, то оно будет соответствующим образом изменяться)

3 ответа

Если вы хотите вывести все текстовые узлы в элементе Details, вы просто перебираете их все, используя xsl: for-each, и используйте функцию position() для вывода запятой, если узел не является первым

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

 <xsl:template match="Details">
 <xsl:for-each select="//text()">
 <xsl:if test="position() > 1">
 <xsl:text>,</xsl:text>
 </xsl:if>
 <xsl:value-of select=".">
 </xsl:value-of></xsl:for-each>
 </xsl:template>
</xsl:output></xsl:stylesheet>

Итак, если в одном из ваших элементов нет текста, он не будет выводиться или иметь дополнительную запятую.


Если вы используете XSLT 2.0, вы можете использовать оператор () для построения последовательности в том порядке, который вы хотите, а затем использовать атрибут separator для xsl:value-of для вывода всей последовательности с запятыми:

<xsl:template match="Details">
 </xsl:template>

Если вы хотите отфильтровать элементы с пустым значением (например, если документ содержит ), вы можете сделать это с помощью предиката в выражении select:

(name, profile/address/add1, profile/address/city,
 profile/address/add2)[normalize-space()]

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


<xsl:variable name="name"> 
 </xsl:variable>
<xsl:variable name="add1"> 
 </xsl:variable>
<xsl:variable name="add2"> 
 </xsl:variable>
<xsl:variable name="city"> 
 </xsl:variable>

Он отобразит O/P, как этот abc, ccc, CA, bbb если add1 возвращает null тогда он будет отображаться следующим образом: abc,, CA, bbb, abc,, CA, bbb

licensed under cc by-sa 3.0 with attribution.