xslt将子属性移动到父级

时间:2015-07-29 14:53:05

标签: xml xslt dita

输入:

select * from MySQL.user

输出:

    <book>
     <chapter href="..">
      <topicref chunk="to-content" href"..">

      </topicref>
      <topicref chunk="to-content" href"..">

      </topicref>
     </chapter>
    </book>    

我无法使用 <book> <chapter chunk="to-content" href=".."> <topicref href".."> </topicref> <topicref href".."> </topicref> </chapter> </book> ,因为它会抛出&#34;如果之前的指令创建了任何子节点,则此处创建属性将失败。&#34;警告然后错误。据我所知here。任何解决方法?

将XSLT 2.0与Saxon 9一起使用。(只是暂停了XSLT / S.O.)。对不起,如果这个太宽泛,但任何方向的任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

为了向chapter元素添加属性,最好有一个匹配chapter元素的模板 - 沿着以下行:

<xsl:template match="chapter">
    <xsl:copy>
        <xsl:attribute name="chunk">to-content</xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

同样,要从chunk移除topicref属性:

<xsl:template match="topicref/@chunk"/>

答案 1 :(得分:0)

试试这个:

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="chapter">
  <xsl:copy>
    <!-- If the chapter contains a topicref with chunk="to-content", set chunk to-content on the chapter unless it's already there.-->
    <xsl:if test=".//topicref/@chunk = 'to-content' and not(@chunk='to-content')">
      <xsl:attribute name="chunk">to-content</xsl:attribute>
    </xsl:if>
    <!-- Copy all chapter attributes -->
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="topicref">
  <xsl:copy>
    <!-- Copy every attribute except chunk="to-content" -->
    <xsl:copy-of select="@*[not(name() = 'chunk' and . = 'to-content')]"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

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