替换或不替换-xsl 1.0结果中的递归调用模板或套用模板树碎片烦恼

时间:2020-06-26 16:39:31

标签: xml xslt xslt-1.0

我有一个源文档,需要通过从另一个源提取/导入/计算的RTF进行合并和充实。我需要合并片段中的入站内容值,以替换等效节点所在的现有内容,并在不存在等效节点的情况下添加。

我已经尝试了许多尝试来解决这个问题,但是我不是专家,并且可以肯定的是,我已经使问题复杂化了。请在下面查看我微不足道的尝试和失败,并提供源文档和导入片段的示例以及预期结果。请帮帮我!

在过去的几周中,我尝试将许多类似的问题解决方案组合在一起,但是示例全部使用值而不是导入的片段。我不太了解自己在做什么错!

原始文件 XML:

<?xml version="1.0" encoding="UTF-8"?>
<sourceDocument>
   <lotsOfChildNodes />
   <thisBitToUpdate>
      <repeatedElements>
         <repeatedElement>
            <repeatedElementName>element1</repeatedElementName>
            <repeatedElementContent>Content1</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element2</repeatedElementName>
            <repeatedElementContent>Content2</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element3</repeatedElementName>
            <repeatedElementContent>Content3</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element4</repeatedElementName>
            <repeatedElementContent>Content4</repeatedElementContent>
         </repeatedElement>
      </repeatedElements>
   </thisBitToUpdate>
   <lotsMoreChildNodes />
</sourceDocument>

导入的RTF XML:

<repeatedElements>
   <repeatedElement>
      <repeatedElementName>element2</repeatedElementName>
      <repeatedElementContent>Content2Updated</repeatedElementContent>
   </repeatedElement>
   <repeatedElement>
      <repeatedElementName>element4</repeatedElementName>
      <repeatedElementContent>Content4Updated</repeatedElementContent>
   </repeatedElement>
   <repeatedElement>
      <repeatedElementName>element5</repeatedElementName>
      <repeatedElementContent>Content5New</repeatedElementContent>
   </repeatedElement>
   <repeatedElement>
      <repeatedElementName>element6</repeatedElementName>
      <repeatedElementContent>Content6New</repeatedElementContent>
   </repeatedElement>
</repeatedElements>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl">
<xsl:import href="routineGeneratingContentToMerge"/>

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

<xsl:template match="/sourceDocument/lotsOfChildNodes/thisBitToUpdate/repeatedElements">
<xsl:variable name="nodeName" select="localName()" />
<xsl:variable name="newElementCount" select="1" />
<xsl:variable name="newElements" select="exsl:node-set($importedRepeatedElements)/repeatedElements" />
<element name="$nodeName">
    <call-template name="replaceDupesAndAdd">
<xsl:with-param name="positionCount" select="$newElementCount" />
<xsl:with-param name="elementsToMerge" select="$newElements" />
<xsl:with-param name="currentElements" select="." />
</call-template>
</element>

  
</xsl:template>

<xsl:template name="replaceDupesAndAdd">
<xsl:param name="positionCount" />
<xsl:param name="elementsToMerge" />
<xsl:param name="currentElements" />

<xsl:variable name="countElementsToMerge" select="count($elementsToMerge/repeatedElement)" />
<xsl:variable name="mergeElementName" >
<xsl:value-of select="$elementsToMerge/repeatedElement[position()=$positionCount]/repeatedElementName" />
</xsl:variable>

<xsl:if test="$positionCount &lt;= $countElementsToMerge">
<xsl:for-each select="exile:node-set($currentElements)/repeatedElement" >
<xsl:variable name="elementName">
<xsl:value-of select="./repeatedElementName">
</xsl:variable>
<xsl:choose>
<xsl:when test="$elementName=$mergeElementName">
<xsl:copy-of select="$elementsToMerge/repeatedElement[repeatedElementName=$mergeElementName]" />
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
<xsl:otherwise>
</xsl:choose>
<xsl:for-each>
<xsl:variable name="newCount">
<xsl:value-of select="number($positionCount+'1')" />
</xsl:variable>
<!-- call-template name="replaceDupesAndAdd">
<xsl:with-param name="positionCount" select="$newCount" />
<xsl:with-param name="currentElements" select="." />
<xsl:call-template -->
</xsl:if>


</xsl:template>

</xsl:stylesheet>

所需结果 原始文件 XML:

<?xml version="1.0"?>
<sourceDocument>
   <lotsOfChildNodes />
   <thisBitToUpdate>
      <repeatedElements>
         <repeatedElement>
            <repeatedElementName>element1</repeatedElementName>
            <repeatedElementContent>Content1</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element2</repeatedElementName>
            <repeatedElementContent>Content2Updated</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element3</repeatedElementName>
            <repeatedElementContent>Content3</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element4</repeatedElementName>
            <repeatedElementContent>Content4Updated</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element5</repeatedElementName>
            <repeatedElementContent>Content5New</repeatedElementContent>
         </repeatedElement>
         <repeatedElement>
            <repeatedElementName>element6</repeatedElementName>
            <repeatedElementContent>Content6New</repeatedElementContent>
         </repeatedElement>
      </repeatedElements>
   </thisBitToUpdate>
   <lotsMoreChildNodes />
</sourceDocument>

1 个答案:

答案 0 :(得分:0)

请考虑在不同条件下提取片段文档节点:1)仅在源文档中,2)也在源文档中,以及3)仅在片段文档中。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>
   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="repeatedElements">
    <xsl:copy>
      <xsl:variable name="fragment" select="document('RepeatElementsMergeDoc_Fragment.xml')/descendant::repeatedElement"/>
      <xsl:variable name="curr_val" select="repeatedElement/repeatedElementName"/>
      
      <xsl:copy-of select="repeatedElement[not(repeatedElementName = $fragment/repeatedElementName)]"/>   
      <xsl:copy-of select="$fragment[repeatedElementName = $curr_val]" /> 
      <xsl:copy-of select="$fragment[not(repeatedElementName = $curr_val)]" />    
    </xsl:copy>
  </xsl:template>  
    
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<sourceDocument>
  <lotsOfChildNodes/>
  <thisBitToUpdate>
    <repeatedElements>
      <repeatedElement>
        <repeatedElementName>element1</repeatedElementName>
        <repeatedElementContent>Content1</repeatedElementContent>
      </repeatedElement>
      <repeatedElement>
        <repeatedElementName>element3</repeatedElementName>
        <repeatedElementContent>Content3</repeatedElementContent>
      </repeatedElement>
      <repeatedElement>
        <repeatedElementName>element2</repeatedElementName>
        <repeatedElementContent>Content2Updated</repeatedElementContent>
      </repeatedElement>
      <repeatedElement>
        <repeatedElementName>element4</repeatedElementName>
        <repeatedElementContent>Content4Updated</repeatedElementContent>
      </repeatedElement>
      <repeatedElement>
        <repeatedElementName>element5</repeatedElementName>
        <repeatedElementContent>Content5New</repeatedElementContent>
      </repeatedElement>
      <repeatedElement>
        <repeatedElementName>element6</repeatedElementName>
        <repeatedElementContent>Content6New</repeatedElementContent>
      </repeatedElement>
    </repeatedElements>
  </thisBitToUpdate>
  <lotsMoreChildNodes/>
</sourceDocument>
相关问题