2つの異なる形式の間でxmlからxmlに変換しています。
私の質問:
コード「B」のサブフィールドのシーケンスを選択するにはどうすればよいですか?これは「A」の次の兄弟ですが、他のフィールドの兄弟ではありません。誰かが正しいノードを「選択」する方法を理解するのを手伝ってくれるなら
制限事項:
- XSLT 1.0
-私は別の記事の量にdatafields中とによるコンテンツの順序を変更することはできません。前後のサブフィールドに基づいて、異なるルールセットが適用されます。
-特定の位置を使用できません(2つのサブフィールド「B」が「A」などの後に続くという保証はありません)
例:
各投稿には、任意の数のサブフィールドを持つデータフィールドが含まれています。
XMLはこれに似ています
<datafield tag="1">
<subfield code="A"></subfield>
<subfield code="B"></subfield>
<subfield code="B"></subfield>
<subfield code="C"></subfield>
<subfield code="D"></subfield>
<subfield code="B"></subfield>
<subfield code="B"></subfield>
<subfield code="G"></subfield>
</datafield>
私のxslt:
<xsl:template match="datafield[@tag=1]">
<xsl:choose>
<datafield>
<xsl:attribute name="tag">new tag</xsl:attribute>
<!-- Do not transfer subfield code='X' -->
<xsl:for-each select="./subfield[@code != 'X']">
<subfield>
<xsl:choose>
<xsl:when test="./@code = 'A'">
<xsl:attribute name="code">New code</xsl:attribute>
<!-- Find siblings with the code 'B'.PROBLEM all fields with the code B is selected-->
<xsl:when test="./following-sibling::subfield[@code='B']"> Apply operation here </xsl:when>
</xsl:choose>
</xsl:when>
</xsl:choose>
</subfield>
</xsl:if>
</xsl:for-each>
</datafield>
</xsl:when>
</xsl:choose>
私はかなり新しいstackoverflowユーザーなので、重要な入力を見逃した場合は教えてください。
最も簡単な方法は、カウントに基づいて何かを行うことです-先行する非Bの数が私の先行する非Bの数に1を加えた数と同じである次のすべてのBを選択します(つまり私)
following-sibling::subfield[@code='B']
[count(preceding-sibling::subfield[not(@code='B')])
= count(current()/preceding-sibling::subfield[not(@code='B')]) + 1]
より効率的な方法は、キーグループBを最も近い先行する非Bで定義することです。
<xsl:key name="BbyNonB" match="subfield[@code='B']"
use="generate-id(preceding-sibling::subfield[not(@code='B')][1])" />
次に、現在の(非B)サブフィールドの直後にあるすべてのBを抽出できます。
key('BbyNonB', generate-id())
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加