【问题标题】:Template correction in XSLTXSLT 中的模板更正
【发布时间】:2012-05-17 07:02:42
【问题描述】:
<To>
    <Id>SERVICE</Id>
    <Role>Commuter</Role>
</To>
<BPD>
    <OrgNo>234</OrgNo>      
</BPD>
<BON>123</BON>

我有这个输入 XML,我想在其中检查 //To/Id 是否包含 SERVICE。 如果它包含 SERVICE,则应在 &lt;BPD&gt; 命名 &lt;BON&gt;SERVICE&lt;/BON&gt; 之后添加一个元素。 我还想检查我的输入 XML 是否已经包含 &lt;BON&gt; 元素,那么它的值应该是 替换为 &lt;Id&gt; 元素中的 SERVICE。

我为此创建了一个模板 ->

<xsl:template match="BPD">
 <xsl:choose>
   <xsl:when test="not(BON) and normalize-space(/To[Role='Commuter']/Id)='SERVICE'">
     <BON>
    <xsl:text>SERVICE</xsl:text>
     </BON>
   </xsl:when>          
   <xsl:when test="normalize-space(BON) and normalize-space(/To[Role='Commuter']/Id)='SERVICE'">
      <BON>
    <xsl:text>SERVICE</xsl:text>
      </BON>
    </xsl:when>
 </xsl:choose>
</xsl:template>

此模板正在检查是否存在。如果它不存在,则创建&lt;BON&gt; 元素并为其添加“SERVICE”作为值。 如果存在,那么它会再创建一个不需要的元素。 我需要纠正我的第二种情况。

【问题讨论】:

  • 您是要替换现有的&lt;BON&gt; 还是添加它?
  • 两种情况。 1) 如果 不存在,则添加到它并且值应该是 SERVICE。 2) 如果 存在,那么它的值应该被 SERVICE 替换。

标签: xml xslt xslt-1.0


【解决方案1】:

如果您只是替换现有的&lt;BON&gt;(如果存在),您应该只需要这个:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="BPD[../To[Role='Commuter']/Id='SERVICE']">
    <xsl:call-template name="ident"/>
    <BON>SERVICE</BON>
  </xsl:template>

  <xsl:template match="BON[../To[Role='Commuter']/Id='SERVICE']"/>  

</xsl:stylesheet>

使用以下任一输入:

<doc>
  <To>
    <Id>SERVICE</Id>
    <Role>Commuter</Role>
  </To>
  <BPD>
    <OrgNo>234</OrgNo>      
  </BPD>
  <BON>123</BON>  
</doc>

或者这个输入(没有&lt;BON&gt;

<doc>
  <To>
    <Id>SERVICE</Id>
    <Role>Commuter</Role>
  </To>
  <BPD>
    <OrgNo>234</OrgNo>      
  </BPD>
</doc>

它会产生这个输出:

<doc>
   <To>
      <Id>SERVICE</Id>
      <Role>Commuter</Role>
   </To>
   <BPD>
      <OrgNo>234</OrgNo>
   </BPD>
   <BON>SERVICE</BON>
</doc>

【讨论】:

    【解决方案2】:

    我认为您的意思是,如果您有一个 To 元素,其 id 为“SERVICE”且 Role 'Commuter' 那么你要确保后面有一个值为 'SERVICE' 的 BON 元素(如果它已经存在则替换任何现有元素)。

    这可以在不使用 xsl:choose 的情况下完成,而是使用两个单独的匹配模板。首先,您可以匹配您有一个 BON 元素并且前面的元素是 'Commuter' 和 'SERVICE' 的情况。

    <xsl:template match="BON[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']]">
    

    然后你可以有一个匹配 BPD 元素的模板,其中根本没有 BON 元素。

    这是完整的 XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" indent="yes"/>
    
       <xsl:template match="BON[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']]" name="bon">
          <BON>SERVICE</BON>
       </xsl:template>   
    
       <xsl:template match="BPD[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']][not(following-sibling::BON)]">
          <xsl:call-template name="identity" />
          <xsl:call-template name="bon" />
       </xsl:template>
    
       <xsl:template match="@*|node()" name="identity">
          <xsl:copy>
             <xsl:apply-templates select="@*|node()"/>
          </xsl:copy>
       </xsl:template>
    </xsl:stylesheet>
    

    请注意命名模板的使用,以避免 BON 元素的重复编码。

    应用于以下 XML 时

    <Root>
       <To>
          <Id>SERVICE</Id>
          <Role>Commuter</Role>
       </To>
       <BPD>
          <OrgNo>234</OrgNo>
       </BPD>
       <BON>123</BON>
    </Root>
    

    以下是输出

    <Root>
       <To>
          <Id>SERVICE</Id>
          <Role>Commuter</Role>
        </To>
        <BPD>
           <OrgNo>234</OrgNo>
        </BPD>
        <BON>SERVICE</BON>
    </Root>
    

    如果您将输入 XML 更改为以下内容,那么在这种情况下它也会产生相同的输出

    <Root>
       <To>
          <Id>SERVICE</Id>
          <Role>Commuter</Role>
       </To>
       <BPD>
          <OrgNo>234</OrgNo>
       </BPD>
    </Root>
    

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2015-02-18
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多