使用XSLT更新元素名称和值

时间:2013-09-18 16:28:20

标签: xslt

在我之前的问题“XSLT transformation from XML to XML document”的背景下。我还在努力 如果“dataset / type / text()='test'”的值,则将“<value>”元素重命名为“<sName>”并将值更新为“ABC”。我在下面写了代码 同样但它没有按预期工作。请帮忙。

源XML -

<soapenv:Header/>
    <soapenv:Body>
        <v1:QueryRequest version="1">
            <subject>
            <dataList>
                <!--1 or more repetitions:-->
                <dataset>
                <type>company</type>
                <value>abc</value>
            </dataset>
            <dataset>
                <type>user</type>
                <value>xyz</value>
            </dataset>
        </dataList>
        </subject>      
        <testList>
        <!--1 or more repetitions:-->
            <criteria>
                    <type>test</type>
                    <value>1234</value>
            </criteria>
            <criteria>
        <type>test2</type>
        <value>false</value>
            </criteria>
        </testList>
        </v1:QueryRequest>
    </soapenv:Body>
</soapenv:Envelope>

XSL文件: -

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:old="http://www.abc.com/s/v1.0"
exclude-result-prefixes="old"
xmlns:v2="http://www.abc.com/s/v2.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"
    version="1.0" />

<xsl:param name="newversion" select="'2.0'" />
<xsl:param name="ABC" select="'ABC'" />
<xsl:param name="XYZ" select="'XYZ'" />
<xsl:param name="DFG" select="'DFG'" />


<!-- fix namespace declarations on root element -->
<xsl:template match="/*">
    <xsl:element name="{name()}" namespace="{namespace-uri()}">
        <!-- copy the v2: binding from the stylesheet document -->
        <xsl:copy-of select="document('')/xsl:stylesheet/namespace::v2" />
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<!-- replace namespace of elements in old namespace -->
<xsl:template match="old:*">
    <xsl:element name="v2:{local-name()}">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="old:QueryRequest/@version">
    <xsl:attribute name="version">
      <xsl:value-of select="$newversion" />
     </xsl:attribute>
</xsl:template>


 <xsl:template match="criteria[type='service']/value">
         <xsl:choose>
         <xsl:when test="criteria[type='service']/value/text()='1234'">
        <xsl:element name="sName">
            <xsl:value-of select="$ABC"/>           
            </xsl:element>
        </xsl:when>
        <xsl:when test="criteria[type='service']/value/text()='5464'">
        <xsl:element name="sName">
            <xsl:value-of select="$XYZ"/>
        </xsl:element>                      
        </xsl:when>       
        <xsl:when test="criteria[type='service']/value/text()='8755'">
        <xsl:element name="sName">
            <xsl:value-of select="$DFG"/>
        </xsl:element>          
        </xsl:when>                     
       </xsl:choose>
     </xsl:template>


    <xsl:template match="type/text()">
        <xsl:value-of
        select="translate(., 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
    </xsl:template>

</xsl:stylesheet>

预期产出:

   <testList>
    <criteria>
        <type>test</type>
        <sName>ABC</sName>
    </criteria>
    <criteria>
        <type>test2</type>
        <value>false</value>
    </criteria>
</testList>

1 个答案:

答案 0 :(得分:2)

<xsl:template match="criteria[type='service']/value">

value元素是当前上下文节点,因此您的其他XPath表达式需要相对于此,即代替

<xsl:when test="criteria[type='service']/value/text()='1234'">

你只需要使用

<xsl:when test="text()='1234'">

或更好

<xsl:when test=".='1234'">