1

以下のように順番にproceduralStepをカウントしていきます。実装方法がわかりません。

XML:

<mainProcedure>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
    <proceduralStep/>
    <proceduralStepAlts>
        <proceduralStep>
            <proceduralStepAlts>
                <proceduralStep/>
                <proceduralStep/>
            </proceduralStepAlts>
        </proceduralStep>
        <proceduralStep/>
    </proceduralStepAlts>
</mainProcedure>

有効なスキーマ:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mainProcedure" type="mainProcedureElemType"/>
    <xs:complexType name="mainProcedureElemType">
        <xs:choice maxOccurs="unbounded">
            <xs:element ref="proceduralStep"/>
            <xs:element ref="proceduralStepAlts"/>
        </xs:choice>
    </xs:complexType>
    <xs:element name="proceduralStep" type="proceduralStepElemType"/>
    <xs:complexType name="proceduralStepElemType">
        <xs:sequence>
            <xs:element ref="title"/>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
                <xs:element ref="proceduralStep"/>
                <xs:element ref="proceduralStepAlts"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="proceduralStepAlts" type="proceduralStepAltsElemType"/>
    <xs:complexType name="proceduralStepAltsElemType">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="proceduralStep"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

望ましい出力: 1 1 2 3 3.1 3.1 3.2 3 4

出力が望ましい理由: proceduralStepAlts は複数の手続き型ステップをラップします。セットは「1 つ」のみと見なされるため、各手続き型ステップは同じアウトライン番号で表示されます。

4

3 に答える 3

0

このスタイルシート:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

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

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

    <xsl:template match="proceduralStep[parent::proceduralStepAlts]">
        <xsl:value-of select="
                count(parent::proceduralStepAlts/preceding-sibling::proceduralStepAlts)
              + count(parent::proceduralStepAlts/preceding-sibling::proceduralStep)
              + 1"/>                
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="proceduralStep[parent::mainProcedure]">
        <xsl:value-of select="
              count(preceding-sibling::proceduralStepAlts)
            + count(preceding-sibling::proceduralStep)
            + 1"/>                
        <xsl:text> </xsl:text>
    </xsl:template>

</xsl:stylesheet>

提供された入力で目的の出力を生成します。

于 2013-04-11T04:34:34.727 に答える
0

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="proceduralStepAlts/proceduralStep">
  <xsl:value-of select=
  "concat(count(../preceding-sibling::*) +1, ' ')"/>
 </xsl:template>

 <xsl:template match="/*/proceduralStep">
  <xsl:value-of select=
   "concat(count(preceding-sibling::*) +1, ' ')"/>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<mainProcedure>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
    <proceduralStep/>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
</mainProcedure>

必要な結果が生成されます。

1 1 2 3 3 

2番目の解決策:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
   <xsl:apply-templates select="*[self::proceduralStep or proceduralStep]"/>
 </xsl:template>

 <xsl:template match="proceduralStep | proceduralStepAlts">
  <xsl:variable name="vPos" select="position()"/>

  <xsl:for-each select="self::proceduralStep | proceduralStep">
   <xsl:value-of select="concat($vPos, ' ')"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換を同じ XML ドキュメント (上記) に適用すると、同じ正しい結果が生成されます。

1 1 2 3 3 
于 2013-04-11T04:57:11.800 に答える
0

ルート要素の下の要素を数えているだけだと思う​​ので、この式を使用できます

<xsl:number count="/*/*" />

これが「完全な」XSLTです

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

   <xsl:template match="proceduralStep">
      <xsl:number count="/*/*" />
   </xsl:template>
</xsl:stylesheet>

XML に適用すると、次のように出力されます。

11233
于 2013-04-11T07:18:38.620 に答える