输入XML:
<root>
<data>
<Data>
<rt>ArgoElectrnicsShop</rt>
<report>
<row>
<tn>new tv</tn>
<value>Samsung</value>
</row>
<row>
<tn>new radio</tn>
<value>Sony</value>
</row>
<row>
<tn>new WashingMachine</tn>
<value>Whirlpool</value>
</row>
</report>
</Data>
</data>
</root>
XSL:
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:element name="DataModel">
<xsl:apply-templates select="/root/data/Data/rt"/>
</xsl:element>
</xsl:template>
<xsl:template match="/root/data/Data/rt[text()='ArgoElectrnicsShop']">
<xsl:element name="T_New">
<xsl:apply-templates select="../report" mode="check"/>
</xsl:element>
</xsl:template>
<xsl:template match="report" mode="check">
<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz:"/>
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="EntireValue">
<xsl:value-of select="row[substring-after(tn, ' ')]/tn"/>
</xsl:variable>
<xsl:variable name="Field">
<xsl:value-of select="row[substring-after($EntireValue, ' ')]"/>
</xsl:variable>
<xsl:call-template name="sample">
<xsl:with-param name="tn" select="translate($EntireValue,$lowercase,$uppercase)"/>
<xsl:with-param name="value" select="row[substring-after(tn, ' ')=$Field]/value"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="sample">
<xsl:param name="tn"/>
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="substring-after($tn, ' ')='TV'">
<xsl:element name="tv">
<xsl:value-of select="$value"/>
</xsl:element>
</xsl:when>
<xsl:when test="substring-after($tn, ' ')='RADIO'">
<xsl:element name="radio">
<xsl:value-of select="$value"/>
</xsl:element>
</xsl:when>
<xsl:when test="substring-after($tn, ' ')='WASHINGMACHINE'">
<xsl:element name="washingmachine">
<xsl:value-of select="$value"/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
**Output XML:**
<DataModel>
<T_New>
<tv>Samsung</tv>
</T_New>
</DataModel>
**Expected Output XML by running through all rows:**
<DataModel>
<T_New>
<tv>Samsung</tv>
<radio>Sony</radio>
<washingmachine>Whirlpool</washingmachine>
</T_New>
</DataModel>
答案 0 :(得分:0)
正如我在评论中所写,你的问题并不完全清楚。通过应用以下样式表可以非常轻松地生成预期输出:
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:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:template match="/root">
<DataModel>
<xsl:apply-templates select="data/Data[rt='ArgoElectrnicsShop']"/>
</DataModel>
</xsl:template>
<xsl:template match="Data">
<T_New>
<xsl:apply-templates select="report/row"/>
</T_New>
</xsl:template>
<xsl:template match="row">
<xsl:element name="{translate(substring-after(tn, ' '), $uppercase, $lowercase)}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
但是,这假定了许多事情 - 最重要的是tn
值中空格后面的字符串是有效的XML元素名称。