3

次のxmlのようなものがあります(これは実際にはデータセットがはるかに大きいというわけではありません):

 <people>
<!-- People start here -->
        <person>
        <name>Sara</name>
        <age>27</age>
        </person>
 <person>
        <name>Carl</name>
        <age>25</age>
        </person>
<!-- Nick is the father -->
    <person>
        <name>Nick</name>
        <age>52</age>
        </person>
</people>

すべての人に行を追加する XSL を書きました。人が次のようになっていると想像してください。

<person>
<name>Sara</name>
<age>27</age>
<gender>female</gender>
</person>

ただし、コメントを保持したいのですが、終了ノードの後に​​コメントがあるものとないものがあります。私は多くの角度を試しましたが、前のノードがコメントであるかどうかを確認する方法がわかりません。次のいずれも機能していません。

  • previous-sibling::comment()[1] (コメントが 1 つある場合は、常にこれを取得します)
  • previous-sibling::* (コメントを取得しません)
  • 先行::* (コメントを取得しません)

前のノードを見て、それがタイプケースであるかどうかを確認する必要があります。そうでない場合は、コメントを取得して吐き出します。たぶん、ドキュメント全体でノードの位置を調べて (どのように?)、その前のノードをそのようにチェックする必要がありますか? これが効率的である必要はありません。

ありがとう

4

3 に答える 3

2

xmlフラグメントのコメントを保持する次のようなものはどうですか:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="person">
    <xsl:copy>
        <xsl:copy-of select="."/>
        <gender>gender goes here</gender>
    </xsl:copy>
</xsl:template>
于 2012-11-29T12:59:46.440 に答える
0

このテンプレートは、コメントを含むすべての処理命令にコピーする必要があります

<xsl:template match="processing-instruction()">
    <xsl:copy/>
</xsl:template>
于 2012-11-29T16:46:22.380 に答える
-1

しばらく XSLT の作業を行っていませんが、できますか?

<xsl:if test="preceding-sibling::comment()[1]">
  <comment>
    <xsl:value-of select="preceding-sibling::comment()[1]" />
  </comment>
</xsl:if>

http://www.xsltcake.com/で動作するようですが、People のコメントが 2 回表示されます。

于 2012-11-29T12:58:21.370 に答える