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)。私はそれが私の反復に関係していることを知っています...しかし、これに対処する方法がわかりません。

スタイルシートの適用についても認識していますが、その謎を解明することもできませんでした...レベルで m の値をチェックし、レベルでスタイルシートを適用することからすべてを処理するだけの XSLT で<TopLevel><\TopLevel><data><s><s>誰かが私を助けることができれば私は信じられないほど素晴らしいものになるでしょう

4

2 に答える 2

1

どの出力を生成したいかはわかりませんが、置き換えたいと思われます

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

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

つまり、ドキュメント全体ですべての "s" 要素を選択するのではなく、現在処理している "data" 内の "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>
于 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>

優れた XML 構造を得るには、元の XSLT を少し変更する必要があります。また、一致sするときは、要素に「登って」属性値dataを取得します。R-numbers

root適切な XML ルート要素に必要なテンプレート マッチング。の子として<list>持っている場合は、取り除くこともできます。<record><root>

于 2013-04-10T08:18:00.283 に答える