xsl使用XML中的标题级元素重置现有的行级元素值

时间:2017-01-12 01:01:38

标签: xslt

新年快乐,

我需要使用标题级元素值重置行级元素值。下面是输入XML和预期输出XML,我们非常感谢任何指导。我尝试了几种模板匹配的方法,但我无法产生预期的结果。

输入:

<Products>
   <Company>ABC</Company>
   <City>Pandora</City>
   <Product>
      <Name>Avatar</Name>
      <MadeInCity>New York</MadeInCity>
   </Product>
   <Product>
      <Name>Titanic</Name>
      <MadeInCity>San Francisco</MadeInCity>
   </Product>
   ....
</Products>

输出:

<Products>
   <Company>ABC</Company>
   <Product>
      <Name>Avatar</Name>
      <MadeInCity>Pandora</MadeInCity>
   </Product>
   <Product>
      <Name>Titanic</Name>
      <MadeInCity>Pandora</MadeInCity>
   </Product>
   ....
</Products>

如上所示,我想在下面使用XSL进行操作

  1. Products / Product / MadeInCity 元素值的值替换为 Products / City 元素值
  2. 删除元素产品/城市
  3. 以下是我的尝试

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="node()|@*">
      <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
     </xsl:template>
    
    <xsl:template match="Products/Product/MadeInCity">
            <value>
                <xsl:choose>
                    <xsl:when test="Products/City">
                        <xsl:value-of select="Products/City"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="."/>
                    </xsl:otherwise>
                </xsl:choose>
            </value>
        </xsl:template>
    
    </xsl:stylesheet>
    

    - 谢谢你

1 个答案:

答案 0 :(得分:1)

我会这样做:

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:strip-space elements="*"/>

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

<!-- if City exists, replace the value of MadeInCity  -->
<xsl:template match="/Products[City]/Product/MadeInCity">
    <xsl:copy>
        <xsl:value-of select="/Products/City"/>
    </xsl:copy>
</xsl:template>

<!-- remove City -->
<xsl:template match="City"/>

</xsl:stylesheet>