【问题标题】:updating element name and value using XSLT使用 XSLT 更新元素名称和值
【发布时间】:2013-09-18 16:28:19
【问题描述】:

在我之前的问题“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>

【问题讨论】:

    标签: xslt


    【解决方案1】:

    <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'">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2011-06-24
      • 1970-01-01
      • 2010-10-09
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多