在 XSLT 中将多个元素输出为 JSON 数组

Output multiple elements as a JSON array in XSLT

我有如下所示的 XSL 代码。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />

  <xsl:variable name="inlineAddressArray">
    <addrline>Home1</addrline>
    <addrline>Home2</addrline>
    <addrline>Home3</addrline>
  </xsl:variable>

  <xsl:variable xmlns:exsl="http://exslt.org/common" name="data" select="exsl:node-set($inlineAddreddArray)" />

  <addressLines>
    <xsl:value-of select="$data/addrline" />
  </addressLines>

</xsl:stylesheet>

我预期的 JSON 输出应该是:

"addressLines":"[Home1,Home2,Home3]"

我得到的输出

"addressLines": "Home1Home2Home3"

基本上它只是将每个元素连接成一个元素。

但是,我应该如上所示分别获取三个元素。

谁能帮我解决这个问题?如果这是一个愚蠢的查询,请不要介意。我是 XSLT 的新手:)

不需要 Newtonsoft.Json.JsonConvert.SerializeXmlNode() .

鉴于此 xml:

<inlineAddressArray>
  <addrline>Home1</addrline>
  <addrline>Home2</addrline>
  <addrline>Home3</addrline>
</inlineAddressArray>

使用这个 xslt 2.0:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"  encoding="UTF-8" />
  
  <xsl:template match="inlineAddressArray">
    <xsl:text>"addressLines":"[</xsl:text>
    <xsl:value-of select="addrline" separator=","/>
    <xsl:text>]"</xsl:text>
  </xsl:template>
  
</xsl:stylesheet>

或使用 xslt 1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"  encoding="UTF-8" />
  
  <xsl:template match="inlineAddressArray">
    <xsl:text>"addressLines":"[</xsl:text>
    <xsl:apply-templates select="addrline"/>
    <xsl:text>]"</xsl:text>
  </xsl:template>
  
  <xsl:template match="addrline">
    <xsl:value-of select="."/>
    <xsl:if test="not(position()=last())">
      <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

结果:

"addressLines":"[Home1,Home2,Home3]"

更新

如果您还想处理空地址行,例如

<inlineAddressArray>
  <addrline>Home1</addrline>
  <addrline>Home2</addrline>
  <addrline></addrline>
</inlineAddressArray>

您的 xslt 1.0 可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"  encoding="UTF-8" />
  
  <xsl:template match="inlineAddressArray">
    <xsl:text>"addressLines":"[</xsl:text>
    <xsl:apply-templates select="addrline"/>
    <xsl:text>]"</xsl:text>
  </xsl:template>
  
  <xsl:template match="addrline">
    <xsl:value-of select="."/>
    <xsl:if test=" following-sibling::addrline[(normalize-space(.))]">
      <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="addrline[not(normalize-space(.))]"/>

</xsl:stylesheet>