2016-07-01 7 views
0

<text>を@align属性を持つ別の<p>にラップしたいとします。より明確にするために、以下の例を参照してください。特定の属性が存在する場合は、XSLTを使用して各ノードに個別の親を作成します。

ソース

<p> 
<text>Check</text> 
<text>Check2</text> 
<text align="center">Final</text> 
<text align="right">Final Check</text> 
</p> 

XSLTコード:

<xsl:template match="p"> 
    <xsl:choose> 
     <xsl:when test="child::text/@align"> 
      <xsl:element name="p"> 
       <xsl:attribute name="align"> 
        <xsl:value-of select="child::text/@align"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:element> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

マイ出力

<p align="center right"> 
    <text>Check</text> 
    <text>Check2</text> 
    <text>Final</text> 
    <text>Final Check</text> 
</p> 

予想される出力

<p> 
    <text>Check</text> 
    <text>Check2</text> 
</p> 
<p align="center"> 
    <text>Final</text> 
</p> 
<p align="right"> 
    <text>Final Check</text> 
</p> 
+0

ここでXSLT 1.0またはXSLT 2.0のどちらを使用していると言えますか?ありがとう! –

+0

私はXSLT 2.0を使用しています。 – user1451239

+0

@ user1451239 http://stackoverflow.com/help/someone-answers –

答えて

0

このXSLTを試してみてください私はあなたがそれをこのように行うことをお勧め:このと他の提案の違いを理解することが

XSLT 2.0

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

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

<xsl:template match="p"> 
    <xsl:for-each-group select="text" group-adjacent="string(@align)"> 
     <p> 
      <xsl:if test="current-grouping-key()"> 
       <xsl:attribute name="align" select="current-grouping-key()" /> 
      </xsl:if> 
      <xsl:apply-templates select="current-group()" /> 
     </p> 
    </xsl:for-each-group> 
</xsl:template> 

<xsl:template match="text/@align"/> 

</xsl:stylesheet> 

、使用をこれはテスト入力として:

<p> 
    <text>Check</text> 
    <text>Check2</text> 
    <text align="center">Check3</text> 
    <text align="center">Check4</text> 
    <text align="right">Check5</text> 
    <text>Check6</text> 
</p> 
0

これはまさにそれを行う簡単な解決策です。あなたがXSLT 2.0を使用していると

<xsl:template match="p"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="text[@align='center']"> 
    <xsl:element name="p"> 
     <xsl:attribute name="align"> 
     <xsl:value-of select="'center'"/> 
     </xsl:attribute> 
     <xsl:element name="text"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="text[@align='right']"> 
    <xsl:element name="p"> 
     <xsl:attribute name="align"> 
     <xsl:value-of select="'right'"/> 
     </xsl:attribute> 
     <xsl:element name="text"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="text"> 
    <xsl:element name="p"> 
     <xsl:element name="text"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template> 
1

、あなたが一緒にグループにtextalign属性を持つ要素、およびないものをxsl:for-each-groupを利用して、それぞれの場合における適切な行動を取ることができます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p"> 
    <xsl:for-each-group select="text" group-adjacent="boolean(@align)"> 
     <xsl:choose> 
     <xsl:when test="current-grouping-key()"> 
      <xsl:for-each select="current-group()"> 
      <p align="{./@align}"> 
       <xsl:apply-templates select="." /> 
      </p> 
      </xsl:for-each> 
     </xsl:when> 
     <xsl:otherwise> 
      <p> 
      <xsl:apply-templates select="current-group()" /> 
      </p> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="text/@align" /> 
</xsl:stylesheet> 
関連する問題