0

我有以下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 条记录中的 8 条(<s> level)记录。我知道这与我的迭代有关……但我不确定如何解决这个问题。

我也知道应用样式表,但我也无法解开这个谜团......如果有人可以帮助我使用XSLT,它只会处理从<TopLevel>检查<\TopLevel>级别的 m 值和应用级别<data>的样式表等所有内容<s><s>一张唱片我都会大得难以置信。

4

2 回答 2

1

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

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

经过

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

也就是说,您只想处理当前正在处理的“数据”中的“s”元素,而不是选择整个文档中的所有“s”元素。

为什么不使用应用模板来做到这一点?

<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>
于 2013-04-09T20:49:00.913 回答
0

如果您想使用match template并且apply-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>

于 2013-04-10T08:18:00.283 回答