首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别XSLT2.0的部分和公正的后代?

如何识别XSLT2.0的部分和公正的后代?
EN

Stack Overflow用户
提问于 2014-02-19 14:34:30
回答 1查看 60关注 0票数 1

我需要识别XSLT2.0的部分和公正的后代吗?我喜欢分组所有不偏不倚的后代节点。我的输入/输出期望从下面编码。

公正的例子: input1

代码语言:javascript
复制
<p><b><i><font><color>This is impartial paragraph example</color></font></i></b></p>

output1期望:

代码语言:javascript
复制
<p><property><b/></i><font/><color/></property><text>This is impartial paragraph example</text></p>

部分示例: input2

代码语言:javascript
复制
<p><b><color><font><bi>This is partial style example</bi>non-bi</font>non-font</color>non-color</b></p>

output2期望:

代码语言:javascript
复制
<p><property><b/></property><text><color><font><bi>This is partial style example</bi>non-bi</font>non-font</color>non-color</text></p>

input3

代码语言:javascript
复制
<p>non-bold<b><color><font><bi>This is partial style example</bi>non-bi</font></color>non-color</b></p>

output3期望:

代码语言:javascript
复制
<p><property/><text>non-bold<b><color><font><bi>This is partial style example</bi>non-bi</font>non-font</color>non-color</b></text></p>

请帮我做这个!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 08:32:38

这个样式表:

代码语言:javascript
复制
<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="root/p">
        <xsl:choose>
            <xsl:when test="child::text()">
                <xsl:copy>
                    <property/>
                    <text><xsl:copy-of select="child::node()"/></text>
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <property>
                        <xsl:for-each select="descendant::*">
                            <xsl:choose>
                                <xsl:when test="not(current()/following-sibling::text())">
                                    <xsl:element name="{local-name()}"/>
                                </xsl:when>
                            </xsl:choose>
                        </xsl:for-each>
                    </property>
                    <text>
                        <xsl:choose>
                            <xsl:when test="descendant::text()[not(preceding-sibling::*)][not(following-sibling::*)][parent::node()[not(following-sibling::text())]]">
                                <xsl:value-of select="descendant::text()[not(following-sibling::*)][not(preceding-sibling::*)][parent::node()[not(following-sibling::text())]]"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:copy-of select="descendant::node()[following-sibling::text()][1]"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </text>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

当应用于此输入时:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <p><b><i><font><color>This is impartial paragraph example</color></font></i></b></p>

    <p><b><color><font><bi>This is partial style example</bi>non-bi</font>non-font</color>non-color</b></p>

    <p>non-bold<b><color><font><bi>This is partial style example</bi>non-bi</font></color>non-color</b></p>
</root>

生产:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<p>
   <property>
      <b/>
      <i/>
      <font/>
      <color/>
   </property>
   <text>This is impartial paragraph example</text>
</p>
<p>
   <property>
      <b/>
   </property>
   <text>
      <color>
         <font>
            <bi>This is partial style example</bi>non-bi</font>non-font</color>
   </text>
</p>
<p>
   <property/>
   <text>non-bold<b>
         <color>
            <font>
               <bi>This is partial style example</bi>non-bi</font>
         </color>non-color</b>
   </text>
</p>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21883577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档