2013-10-02 43 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加两个孩子“...我只是假设它只是一个例子,但可能是固定的要求。只有原始的海报知道什么是正确的。 –