XSLT 1.0如果不存在,则仅添加一次子元素

时间:2014-08-19 16:59:17

标签: element xslt-1.0

我试图添加一个名为Stamping的元素,并且只有在消息中不存在时。

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

<xsl:template match="/*[local-name()='Envelope']/*[local-name()='Body']/*/*[not(*[local-name()='Stamping'])]">     
 <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
 </xsl:copy>
  <v1:Stamping>
     <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
  </v1:Stamping>
</xsl:template>

出现我的问题是因为根据我现有的匹配对每个这样的孩子重复了新的v1:Stamping值:

<envelope>
<body>
<operationName>
 <child1 Catalog="1" />
 <v1:Stamping>
 <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
 <v1:Stamping>
 <child2 Catalog="2" />
 <v1:Stamping>
     <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
 </v1:Stamping>
</operationName>
</body>
</envelope>

我需要查看结果,其中标记仅作为operationName的子元素添加一次。 operationName是一个将存在的元素,但此XSLT将应用于许多服务,并且operationName中的值将根据将应用此XSLT的服务而有所不同。下面的示例将是所需的输出。

<envelope>
<body>
<operationName>
 <child1 Catalog="1" />
 <child2 Catalog="2" />
 <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
 </operationName>
</body>
</envelope>

1 个答案:

答案 0 :(得分:1)

  

我需要查看结果,其中标记仅添加一次   operationName的子元素。

然后为operationName元素编写一个模板:

<xsl:template match="operationName">

并检查v1:Stamping是否已作为其子女之一存在:

<xsl:if test="not(v1:Stamping)">

如果它不存在,则将其添加到输出树中。

假设以下XML没有v1:Stamping元素作为输入:

XML输入

<?xml version="1.0" encoding="UTF-8"?>
<envelope>
   <body>
      <operationName>
         <child1 Catalog="1"/>
         <child2 Catalog="2"/>
      </operationName>
   </body>
</envelope>

<强>样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:v1="http://www.v1.com" xmlns:v2="http://www.v2.com">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="operationName">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:if test="not(v1:Stamping)">
                <v1:Stamping>
                    <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
                </v1:Stamping>
            </xsl:if>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<envelope>
   <body>
      <operationName>
         <child1 Catalog="1"/>
         <child2 Catalog="2"/>
         <v1:Stamping xmlns:v1="http://www.v1.com" xmlns:v2="http://www.v2.com">
            <v2:UserData CityCode="NO Stamping" Role="User" SecurityId="55"/>
         </v1:Stamping>
      </operationName>
   </body>
</envelope>