2013-10-02 42 views
-1
<?xml version="1.0" encoding="UTF-16"?> 
<items> 
    <item> 
     <count>3</count> 
     <name>Name</name> 
     <description>Description</description> 
    </item> 
</items> 

需要在末尾附加2個額外的子項,具體取決於計數。如果計數是3加兩個孩子。請幫我寫XLS給我。對XSLT來說是新的。 所需的輸出:XML到XLS元素末尾複製當前元素

<?xml version="1.0" encoding="UTF-16"?> 
<items> 
    <item> 
     <count>1</count> 
     <name>Name</name> 
     <description>Description</description> 
    </item> 
    <item> 
     <count>1</count> 
     <name>Name</name> 
     <description>Description</description> 
    </item> 
    <item> 
     <count>1</count> 
     <name>Name</name> 
     <description>Description</description> 
    </item> 
</items> 

回答

0

在XSLT 1.0遞歸模板應的方式,像

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <items> 
      <xsl:apply-templates select="items/item" /> 
     </items> 
    </xsl:template> 

    <xsl:template match="item"> 
     <!-- Call multiplication template for current item --> 
     <xsl:call-template name="multiply"> 
      <xsl:with-param name="item" select="." /> 
     </xsl:call-template> 
    </xsl:template> 

    <!-- recursive named template to ensure multiplication --> 
    <xsl:template name="multiply"> 
     <xsl:param name="item" /> 
     <!-- If count is not passed in as a parameter take it from item param --> 
     <xsl:param name="count" select="$item/count"/> 

     <item> 
      <count>1</count> 
      <xsl:copy-of select="$item/name" /> 
      <xsl:copy-of select="$item/description" /> 
     </item> 

     <!-- Check if still needed to multiplicate --> 
     <xsl:if test="$count &gt; 1"> 
      <!-- Recursive call--> 
      <xsl:call-template name="multiply"> 
       <!-- for the same item --> 
       <xsl:with-param name="item" select="$item" /> 
       <!-- but decreasing number of copies --> 
       <xsl:with-param name="count" select="$count - 1" /> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

大概如果計數不爲零或有應檢查負數或空或不同的類型數目或......但原則應該是一樣的。

0

首先,如果您需要使用XSLT,我建議您閱讀一些教程,以幫助您瞭解XSLT的語法。例如,做W3Schools上的教程。

這裏是一個XSLT,讓你需要的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes"/> 

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

    <!-- When <count> equals 3, create to extra <item> elements, with the same value of this current <item>, but default <count> to 1 --> 
    <xsl:template match="item[count=3]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
     <item> 
      <count>1</count> 
      <name><xsl:value-of select="name" /></name> 
      <description><xsl:value-of select="description" /></description> 
     </item> 
     <item> 
      <count>1</count> 
      <name><xsl:value-of select="name" /></name> 
      <description><xsl:value-of select="description" /></description> 
     </item> 
    </xsl:template> 

    <!-- Reset the <count>3</count> element to value 1 --> 
    <xsl:template match="count[text()=3]"> 
     <xsl:copy> 
      <xsl:text>1</xsl:text> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

如果你想遞歸做的一切,independed的<count>元素,但總是執行它時<count>大於1 ,然後使用下一個模板:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

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

    <!-- When <count> is greater than 1, duplicate the <item> elements occording to the <count>, with the same value of this current <item>, but default <count> to 1 --> 
    <xsl:template match="item[count &gt; 1]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
     <xsl:call-template name="multiply"> 
      <xsl:with-param name="count" select="count" /> 
      <xsl:with-param name="name" select="name" /> 
      <xsl:with-param name="description" select="description" /> 
     </xsl:call-template> 
    </xsl:template> 

    <!-- Reset the <count> element to value 1, when the <count> element is greater than 1 --> 
    <xsl:template match="count[text() &gt; 1]"> 
     <xsl:copy> 
      <xsl:text>1</xsl:text> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Recursive template --> 
    <xsl:template name="multiply"> 
     <xsl:param name="count" /> 
     <xsl:param name="name" /> 
     <xsl:param name="description" /> 

     <xsl:if test="$count &gt; 1"> 
      <item> 
       <count>1</count> 
       <name><xsl:value-of select="$name" /></name> 
       <description><xsl:value-of select="$description" /></description> 
      </item> 

      <xsl:call-template name="multiply"> 
       <xsl:with-param name="count" select="$count - 1" /> 
       <xsl:with-param name="name" select="$name" /> 
       <xsl:with-param name="description" select="$description" /> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+0

可能不會用於其他計數值比3 ...? –

+0

當計數大於3時,它將不起作用。問題也是(我引用):「需要在最後追加兩個額外的孩子,如果計數爲3,則添加兩個孩子」 –

+0

「**如果** count是3加兩個孩子「...我只是假設它只是一個例子,但可能是固定的要求。只有原始的海報知道什麼是正確的。 –