[英]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() > 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() > 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.