如果子节点存在,则创建新的XML节点

时间:2012-12-05 23:52:56

标签: xslt

我一直在尝试使用XSLT实现以下输出,但确实一直在努力。提前感谢您的帮助。

<par>
   <run>Line one<break/>
        Line two<break/>
   </run>

   <run>Another para of text<break/>
   </run>

   <run>3rd para but no break</run>    
</par>

 <document>
   <para>Line one</para>
   <para>Line two</para>
   <para>Another para of text</para>
   <para>3rd para but no break</para>
 </document>

谢谢,

DONO

2 个答案:

答案 0 :(得分:2)

这是一个面向推送的简单解决方案,不需要<xsl:for-each><xsl:if>self::轴。

当这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:strip-space elements="*" />

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

  <xsl:template match="run/text()">
     <para>
       <xsl:value-of select="normalize-space()" />
     </para>
  </xsl:template>

</xsl:stylesheet>

...适用于提供的XML:

<par>
   <run>Line one<break/>
        Line two<break/>
   </run>

   <run>Another para of text<break/>
   </run>

   <run>3rd para but no break</run>    
</par>

...生成了想要的结果:

<document>
  <para>Line one</para>
  <para>Line two</para>
  <para>Another para of text</para>
  <para>3rd para but no break</para>
</document>

答案 1 :(得分:0)

假设您的<run>元素只包含文本和<break/>元素,并且您希望规范化空格并排除仅包含空格的<para>元素(建议的你需要的输出),以下应该有效:

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

    <xsl:output indent="yes"/>

    <xsl:template match="par">
        <document>
            <xsl:apply-templates select="*"/>
        </document>
    </xsl:template>

    <xsl:template match="run">
        <xsl:for-each select="text()">
            <xsl:if test="normalize-space(self::text()) != ''">
                <para>
                    <xsl:value-of select="normalize-space(self::text())"/>
                 </para>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>