xslt如何在xml doc

时间:2017-11-30 08:44:55

标签: xml xslt xslt-2.0

我有一个像下面的例子

<map>
<topicref href="disclaimer_PUBLIC.dita" outputclass="Top">
    <fig>
      <image href="">
        qw
      </image>
      <image href="">
        q1
      </image>
    </fig>
  </topicref>
  <topicref href="DocID030323.xml">
    <fig>
      <image href="">
        qw
      </image>
      <image href="">
        q1
      </image>
    </fig>
  </topicref>
</map>

现在,我想删除标记<fig>,并在topicref outputclass =“Top”时将属性width = 5cm添加到基础图像标记。 我想要输出如下:

<topicref href="../Topics/dita" outputclass="Top">

      <image href="" width="5cm">
        qw
      </image>
      <image href="" width="5cm">
        q1
      </image>

  </topicref>
  <topicref href="DocID030323.dita">
      <fig class="- topic/fig ">
         <image href=""
        qw
      </image>
         <image href="">
        q1
      </image>
      </fig>
  </topicref>

我正在尝试实现此目的,但在xslt中一次只能执行1次操作。 如何结合这两种操作?

当我使用

<xsl:template match="topicref[@outputclass='Top']/fig" >
      <xsl:apply-templates select="node()"/>

  </xsl:template> 

删除了fig元素,但无法更改属性值。

当我使用

<xsl:template match="topicref[@outputclass='Top']/fig/image" >
    <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:attribute name="width">
      <xsl:value-of select="'2.5'"/>
    </xsl:attribute>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>

  </xsl:template>

甚至复制了fig元素。我想在1 xslt中执行这两个操作。 请帮忙。

2 个答案:

答案 0 :(得分:0)

以下XSLT

  <xsl:template match="topicref[@outputclass='Top']/fig">
    <xsl:apply-templates></xsl:apply-templates>
</xsl:template>
<xsl:template match="topicref[@outputclass='Top']/fig/image" >
    <xsl:copy>

        <xsl:copy-of select="@*"/>
        <xsl:attribute name="width">
            <xsl:value-of select="'2.5'"/>
        </xsl:attribute>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>

</xsl:template>
<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*"></xsl:copy-of>
        <xsl:apply-templates></xsl:apply-templates>
    </xsl:copy>
</xsl:template>

制作

<?xml version="1.0" encoding="UTF-8"?><map>
<topicref href="disclaimer_PUBLIC.dita" outputclass="Top">

        <image href="" width="2.5">
            qw
        </image>
        <image href="" width="2.5">
            q1
        </image>

</topicref>
<topicref href="DocID030323.xml">
    <fig>
        <image href="">
            qw
        </image>
        <image href="">
            q1
        </image>
    </fig>
</topicref>
</map>

希望这有帮助

答案 1 :(得分:0)

你可以更快地使用它:

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

<xsl:template match="topicref[@outputclass='Top']/fig">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="image[ancestor::topicref[@outputclass='Top']]">
    <image>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="width" select="'2.5'"/>
        <xsl:apply-templates/>
    </image>
</xsl:template>