1

在我的文档中,我有一些不需要的嵌套<bo>标签。将它们 xslt 带走的最简单方法是什么?

源示例:

<body>
    <bo>
        <bo>some text</bo>
        <bo>
            <bo>some other text</bo>
        </bo>
        <bo>more text</bo>
    </bo>
  
    <bo>
        <fig/>
    <bo/>
</body>

结果示例:

<body>
    <p>some text</p>
    <p>some other text</p>
    <p>more text</p>

    <p>
        <fig/>
    <p>
</body>

提前谢谢!

4

2 回答 2

3

采取以下方法作为基础:

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


<xsl:template match="bo[.//bo]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="boo[not(boo)]">
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

如果这还不够,那么您需要更详细地解释您可以拥有哪些输入变体以及您希望如何转换它们。

使用上述模板的完整样式表是

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

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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


<xsl:template match="bo[.//bo]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="boo[not(boo)]">
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

</xsl:stylesheet>

和变换

<body>
    <bo>
            <bo>some text</bo>
            <bo>
                <bo>some other text</bo>
            </bo>
            <bo>more text</bo>
    </bo>
    <bo>
        <fig/>
    </bo>
</body>

进入

<body>
   <bo>some text</bo>
   <bo>some other text</bo>
   <bo>more text</bo>
   <bo>
      <fig/>
   </bo>
</body>
于 2013-07-09T09:56:06.707 回答
0

省略直接嵌套在彼此内部的相同标签的一般解决方案:

<stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform">

    <template match="*[name(..)=name()]">
        <apply-templates/>
    </template>

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

</stylesheet>

英文:“复制每个节点,除非它的名称与其父节点的名称相同;在这种情况下,只需复制子节点”

于 2013-07-09T10:35:58.210 回答