XSLT多个样式表

时间:2013-04-09 18:38:16

标签: xslt apply-templates

我有以下xml

<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来执行调用模板,但它没有正确地进行迭代。

<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>

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

我也知道应用样式表但我无法解开这个谜......如果有人可以帮助我使用 XSLT,它只处理从<TopLevel><\TopLevel>的所有内容检查<data>级别的m的值,并在每个<s> 记录的<s>级别应用样式表,我将非常有信心。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

匹配正确的XML根元素所需的模板root<list>您也可以摆脱<record>作为<root>的孩子{/ 1}}。

我希望这是你的期望,并试着玩弄它!

最好的问候,彼得