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] (如果曾经有一个评论,它总是会得到这个)
  • previous-sibling::* (不接受评论)
  • previous::* (不接受评论)

我有点需要查看前面的节点并检查它是否为 case 类型,如果不是,则继续,如果不是,请抓住评论并将其吐出。也许我必须计算出整个文档中的节点位置(如何?)然后以这种方式检查前面的节点?这没有必要是有效的。

谢谢

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 评论。

于 2012-11-29T12:58:21.370 回答