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

时间:2016-12-12 01:04:24

标签: xml xslt

输入XML

<root>
    <data>
        <Data>
            <rShop>ArgoElectrnicsShop</rShop>
            <report>
                <row>
                    <tableName>new tv</tableName>
                    <value>Samsung</value>
                </row>
                <row>
                    <tableName>new radio</tableName>
                    <value>Sony</value>
                </row>
                <row>
                    <tableName>new WashingMachine</tableName>
                    <value>Whirlpool</value>
                </row>
            </report>
        </Data>
    </data>
</root>

广义XSLT(将从此调用所有xslt)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stlyesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:fn="www.w3.org/2005/xpath-functions" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()"/>
    <xsl:strip-space elements="*"/>
    <xsl:include href="ArgoElectrnicsShop.xslt"/>
    <xsl:template match="/">
        <xsl:element name="Documents">
            <xsl:element name="DataModel">
                <xsl:apply-templates select="/root/data/Data/rShop"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stlyesheet>

ArgoElectrnicsShop XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stlyesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:fn="www.w3.org/2005/xpath-functions" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
    <xsl:template match="/root/data/Data/rShop[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="EntireValue">
            <xsl:value-of select="row[substring-after(tableName, ' ')]/tableName"/>
        </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="tableName" select="translate($EntireValue,$lowercase,$uppercase)"/>
            <xsl:with-param name="value" select="row[substring-after(tableName, ' ')=$Field]/value"/>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="sample">
        <xsl:param name="tableName"/>
        <xsl:param name="value"/>
        <xsl:choose>
            <xsl:when test="substring-after($tableName, ' ')='TV'">
                <xsl:element name="tv">
                    <xsl:value-of select="$value"/>
                </xsl:element>
            </xsl:when>
            <xsl:when test="substring-after($tableName, ' ')='RADIO'">
                <xsl:element name="radio">
                    <xsl:value-of select="$value"/>
                </xsl:element>
            </xsl:when>
            <xsl:when test="substring-after($tableName, ' ')='WASHINGMACHINE'">
                <xsl:element name="washingmachine">
                    <xsl:value-of select="$value"/>
                </xsl:element>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stlyesheet>

输出XML:

<Documents>
    <DataModel>
        <T_New>
            <tv>Samsung</tv>
        </T_New>
    </DataModel>
</Documents>

通过遍历所有行预期输出XML:

<Documents>
    <DataModel>
        <T_New>
            <tv>Samsung</tv>
            <radio>Sony</radio>
            <washingmachine>Whirlpool</washingmachine>
        </T_New>
    </DataModel>
</Documents>
  1. 我想为所有行运行上面的xslt并获得预期的输出。
  2. 我有三行输入XML,一行是generalised.xslt和ArgoElectrnicsShop.xslt。 tableName XML元素的值不区分大小写。我想查看下面的情况 xsl:template match =“row [substring-after(tableName,'')='washingmachine'或substring-after(tableName,'')='WashingMachine'或substring-after(tableName,'')=' Washingmachine'或substring-after(tableName,'')='washingMachine'] 在这个例子中,我有四种可能性。所以我可以检查所有的可能性。例如:PowerSavingMobilePhone字有16种可能性。我怎么能以一种简单的方式处理这个问题。
  3. 我可能也将XML元素名称设置为不区分大小写。例如,rShop或RShop或rshop或Rshop。我不知道rShop元素将在哪种情况下。那我怎么检查下面 这里的rShop可以是任何情况。请为此提出解决方案。

1 个答案:

答案 0 :(得分:0)

给出这两个XSLT样式表:

XSLT 1.0(这是将由转化引擎调用的“通用xsl”)

<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:include href="New.xslt"/>

<xsl:template match="/root">
    <Documents>
        <DataModel>
            <xsl:apply-templates select="data/Data"/>
        </DataModel>
    </Documents>
</xsl:template>

</xsl:stylesheet>

<强> New.xslt

<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="Data">
    <T_New>
        <xsl:apply-templates select="report/row"/>
    </T_New>
</xsl:template>

<xsl:template match="row">
    <xsl:element name="{translate(substring-after(tableName, ' '), $uppercase, $lowercase)}">
        <xsl:value-of select="value"/>
    </xsl:element>   
</xsl:template>

</xsl:stylesheet>

结果,当应用于您的输入示例时,将是:

<?xml version="1.0" encoding="UTF-8"?>
<Documents>
   <DataModel>
      <T_New>
         <tv>Samsung</tv>
         <radio>Sony</radio>
         <washingmachine>Whirlpool</washingmachine>
      </T_New>
   </DataModel>
</Documents>