如何在xslt中处理不区分大小写的xml变量

时间:2016-12-11 18:21:06

标签: xml xslt

输入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>
  1. 我想为所有行运行循环以获取值。 tn中的值可以是任何情况,因此我从行的tn中取出值并将其转换为大写,并比较模板样本中的值并在输出xml中写入正确的值。
  2. 我无法浏览xml中的所有行。任何人都可以帮我解决这个问题。

1 个答案:

答案 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元素名称。