如何检查前一个节点是注释还是xml节点?

时间:2012-11-29 12:39:31

标签: xml xslt xpath

我有类似下面的xml(这实际上并不是数据集的FAR更大):

 <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](如果有任何一条评论总会得到这个)
  • preceding-sibling :: *(不接受评论)
  • 前面:: *(不接受评论)

我需要查看前面的节点并检查它是否为case类型,如果它继续,如果不是抓住注释并吐出它。也许我必须计算整个文档中的节点位置(如何?)然后检查前一个节点的方式?没有必要提高效率。

由于

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

暂时还没有完成XSLT的工作,但你能做到吗?

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

似乎在http://www.xsltcake.com/上有点工作,但两次得到人民评论。

答案 2 :(得分:0)

此模板应复制所有处理说明,包括评论

<xsl:template match="processing-instruction()">
    <xsl:copy/>
</xsl:template>