2013-04-09 70 views
0

我有以下XMLXSLT样式表复式

<TopLevel> 
    <data m="R263"> 
    <s ut="263firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="263secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
    <data m="R262"> 
    <s ut="262firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="262secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
</TopLevel> 

我有一些XSLT,做呼叫模板,但它不是正确itterating。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="data"> 
<xsl:value-of select="@m" /> 
<xsl:variable name="vYourName" select="@m"/> 
    <xsl:choose> 
     <xsl:when test="@m='R262'"> 
      <xsl:call-template name="R262"/> 
     </xsl:when> 
    </xsl:choose> 
    <xsl:choose> 
     <xsl:when test="@m='R263'"> 
      <xsl:call-template name="R263"/> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="R262"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

<xsl:template name="R263"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

这给了我8记录在4 (<s> level)记录。我知道这与我的迭代有关......但我不知道如何解决这个问题。

我也知道了应用的样式表,但我不能揭开这种神秘要么...如果有人可以帮助我XSLT只会在<data>级别来处理一切从<TopLevel><\TopLevel>检查m的值并在每个<s>记录的<s>级别上应用样式表,我将无法相信。

+0

你能提供预期的结果XML吗?这将帮助我们了解您的原始XSLT是否可以修改以实现您想要的功能。 – ABach 2013-04-09 19:03:46

+0

我实际上只是要从每个元素中获取数值并返回一个插入语句......我知道我可以将它们作为数据集返回......不知道......这是下一个问题......底线对于上面的例子,我期望得到4条记录263firstrecord,263secondrecord,262firstrecord,262secondrecord),每列有2列(column1和column2)。 非常感谢您的回复,我非常喜欢这个xslt。 – user2263069 2013-04-09 20:33:17

+0

您好,请参阅我的解决方案以应用模板逻辑。问候,彼得 – Peter 2013-04-10 08:18:46

回答

1

我不知道你想生产什么输出,但我怀疑你想要

<xsl:for-each select="/TopLevel/data/s"> 

通过

<xsl:for-each select="s"> 

要替换,你只想要处理的“S”您正在处理的“数据”中的元素,而不是选择整个文档中的所有“s”元素。

为什么不使用apply-templates?

<xsl:template match="data"> 
    ... 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="s[../@m='R262']"> 
    ... 
</xsl:template> 

<xsl:template match="s[../@m='R263']"> 
    ... 
</xsl:template> 
+0

这正是我想要做的,但我无法得到xsl验证...继续得到''和''xsl的行。请告知...并再次感谢。 – user2263069 2013-04-10 01:45:35

+0

我只是需要添加另一个“在所提到的行末...这工作非常感谢! – user2263069 2013-04-10 02:20:00

+0

对不起,我已经更正了建议的代码中的引号。 – 2013-04-10 08:35:41

0

如果你想使用match templateapply-templates你可以做,让你也文本输出,就像你的样式做以下。所以这个XSLT应用到原始源XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="data"> 
    <xsl:value-of select="@m"/> 
    <xsl:apply-templates select="s"/>  
</xsl:template> 

<xsl:template match="s"> 
    Column1=<xsl:value-of select="@ut"/> 
    Column2=<xsl:value-of select="@lt"/> 
</xsl:template> 

</xsl:stylesheet> 

给你这样的输出:

<?xml version="1.0" encoding="UTF-8"?> 
R263 
    Column1=263firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=263secondrecord 
    Column2=2013-02-16T09:21:40.393 
R262 
    Column1=262firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=262secondrecord 
    Column2=2013-02-16T09:21:40.393 

你基本上只匹配在s并给出了属性“UT”和“LT”。你也可以输出看起来更好的XML。

使用此XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <root> 
     <xsl:apply-templates/> 
    </root> 
</xsl:template> 

<xsl:template match="data"> 
    <list> 
     <xsl:apply-templates select="s"/> 
    </list> 
</xsl:template> 

<xsl:template match="s"> 
    <xsl:element name="record"> 
     <xsl:attribute name="m"> 
      <xsl:value-of select="parent::data/@m"/> 
     </xsl:attribute> 
     <item>Column1=<xsl:value-of select="@ut"/></item> 
     <item>Column2=<xsl:value-of select="@lt"/></item> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

会给你这个漂亮的XML输出:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<list> 
    <record m="R263"> 
     <item>Column1=263firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R263"> 
     <item>Column1=263secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 
<list> 
    <record m="R262"> 
     <item>Column1=262firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R262"> 
     <item>Column1=262secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 

你必须去适应原来的XSLT一点点地得到一个不错的XML结构。当匹配s时,您“爬”到元素data以获取R-numbers作为属性值。

模板匹配root您需要一个适当的XML根元素。 <list>你也可以摆脱掉,那么你有<record>作为<root>的孩子。

我希望这是你的预期,并尝试与它一起玩耍!

最好的问候,彼得