簡體   English   中英

使用 XSLT 將 XML 節點組合成單個節點

[英]Combining XML Nodes into a single node with an XSLT

我正在嘗試使用轉換來編輯一些 XML,但我正在努力實現我想要的結果。

我有一些 XML:

<FX>
   <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY" />
   <Attribute NAME="N1" VALUE="V1" />
   <Attribute NAME="N2" VALUE="V2" />
   <Attribute NAME="N3" VALUE="V3" />
</FX>

我想把它改成這樣:

<FX>
   <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY" />
   <Attribute NAME="N1, N2, N3" VALUE="V1,V2,V3" />
</FX>

這可能嗎? 任何人都可以提供有關如何通過轉換做到這一點的任何建議嗎?

您可以使用以下與 Asp.NET 兼容的 XSLT-1.0 樣式表來執行從源 XML 到目標 XML 的 XSLT 轉換:

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

  <xsl:template match="/FX">
    <xsl:copy>
        <xsl:copy-of select="Order" />
        <Attribute>
            <xsl:attribute name="NAME">
                <xsl:for-each select="Attribute">
                    <xsl:value-of select="@NAME" />
                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
            <xsl:attribute name="VALUE">
                <xsl:for-each select="Attribute">
                    <xsl:value-of select="@VALUE" />
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </Attribute>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

它的輸出是:

<FX>
  <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY"/>
  <Attribute NAME="N1, N2, N3" VALUE="V1,V2,V3"/>
</FX>

通常,如果您想轉換一些節點但保留其余節點,您可以使用身份轉換模板作為起點,然后添加更改您想要更改的節點的模板:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="FX/Attribute[1]">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="FX/Attribute[position() > 1]"/>

  <xsl:template match="FX/Attribute[1]/@*">
      <xsl:attribute name="{name()}">
          <xsl:for-each select=". | ../following-sibling::Attribute/@*[name() = name(current())]">
              <xsl:if test="position() > 1">,</xsl:if>
              <xsl:value-of select="."/>
          </xsl:for-each>
      </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jyH9rNk

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM