簡體   English   中英

在XSLT for-each循環中更新變量值

[英]Update variable value in XSLT for-each loop

我有這個XML:

<Root>
  <Employee>
    <Name>Dash</Name>
    <Age>23</Age>
  </Employee>
  <Employee>
    <Name>Gwen</Name>
    <Age>22</Age>
  </Employee>
</Root>

我需要使用XSLT轉換為以下XML:

<Root>
  <Employee>
    <Name>Dash,Gwen</Name>
    <Age>23,22</Age>
  </Employee>
</Root>

我正在使用for-each循環來獲取<Employee>節點的子節點的值。我面臨的問題是我無法弄清楚如何將串聯的值存儲在XSLT的另一個臨時變量中。許多站點我們無法更新XSLT中的變量,那么有沒有其他解決方案呢?

這樣可以嗎?

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="3.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
   <xsl:template match="Root">
      <Root>
         <Employee>
            <Name>
              <xsl:value-of select="Employee/Name" separator="," />
            </Name>
            <Age>
              <xsl:value-of select="Employee/Age" separator="," />
            </Age>
         </Employee>
      </Root>
   </xsl:template>
</xsl:stylesheet>

這就是我的意思,“ 為兩者使用通用模板,避免代碼重復 ”:

XSLT 1.0

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

<xsl:template match="/Root">
    <Root>
        <Employee>
            <Name>
                <xsl:apply-templates select="Employee/Name"/>
            </Name>
            <Age>
                <xsl:apply-templates select="Employee/Age"/>
            </Age>
        </Employee>
    </Root>
</xsl:template>

<xsl:template match="Name|Age">
    <xsl:value-of select="."/>
    <xsl:if test="position()!=last()">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

當我在這里時,我還要指出,這用一個非常有問題的XML結構代替了堅實的XML結構。 我不確定此轉換的目的是什么,但結果是XML可能很難被下游應用程序使用。

請嘗試以下樣式表:

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

    <xsl:output indent="yes"/>

    <xsl:template match="Root">
        <Root>
            <Employee>
                <Name>
                    <xsl:for-each select="Employee/Name">
                        <xsl:if test="position() &gt; 1">
                            <xsl:text>,</xsl:text>
                        </xsl:if>
                        <xsl:value-of select="."/>
                    </xsl:for-each>
                </Name>
                <Age>
                    <xsl:for-each select="Employee/Age">
                        <xsl:if test="position() &gt; 1">
                            <xsl:text>,</xsl:text>
                        </xsl:if>
                        <xsl:value-of select="."/>
                    </xsl:for-each>
                </Age>
            </Employee>
        </Root>
    </xsl:template>
</xsl:stylesheet>

或者作為替代,

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

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <Root>
            <Employee>
                <xsl:apply-templates select="Root/Employee[1]"/>
            </Employee>
        </Root>
    </xsl:template>

    <xsl:template match="Employee[1]/Name|Employee[1]/Age">
        <xsl:variable name="curr_name" select="name()"/>
        <xsl:copy>
            <xsl:value-of select="."/>
            <xsl:for-each select="following::*[name()=$curr_name]">
                <xsl:text>,</xsl:text>
                <xsl:value-of select="."/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>


</xsl:stylesheet>

暫無
暫無

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

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