0

これは私のxmlドキュメントです。xslt2.0を使用してこれを別のxml形式に変換したいと思います。

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                    xmlns:v="urn:schemas-microsoft-com:vml">
        <w:body>

            <w:tbl/>
            <w:tbl/>
       </w:body>
      </w:document>

これは私のxslt2.0コードスニップです。

<xsl:for-each select="following::node()[1]">
    <xsl:choose>
        <xsl:when test="self::w:tbl and (parent::w:body)">
                <xsl:apply-templates select="self::w:tbl"/>
        </xsl:when>
    </xsl:choose>
</xsl:for-each> 


<xsl:template match="w:tbl">
    <table>
      table data
    </table>
</xsl:template>

私が生成した出力は次のとおりです。

<table>
     table data
   <table>
       table data
    </table>
 </table>

しかし、私の必要な出力は次のとおりです。

<table>
     table data
</table>
<table>
     table data
</table>
4

2 に答える 2

2

w:body要素の子要素であるw:tbl要素を変換しようとしている場合は、テンプレートをbody要素と一致させて、tbl要素を検索することができます。

<xsl:template match="w:body">
   <xsl:apply-templates select="w:tbl"/>
</xsl:template>

w:tblに一致するテンプレートは以前と同じです。完全なXSLTは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
   exclude-result-prefixes="w">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/*">
      <xsl:apply-templates select="w:body"/>
   </xsl:template>

   <xsl:template match="w:body">
      <xsl:apply-templates select="w:tbl"/>
   </xsl:template>

   <xsl:template match="w:tbl">
      <table> table data </table>
   </xsl:template>
</xsl:stylesheet>

サンプルXMLに適用すると、次のように出力されます。

<table> table data </table>
<table> table data </table>
于 2012-08-28T07:52:01.350 に答える
2

xsl:for-eachが実行される時点で、コンテキスト項目が何であるかはわかりません。この情報を提供していないという事実は、XSLTでコンテキストがどれほど重要であるかを理解していないことを示唆している可能性があります。コンテキストが何であるかを知らずにコードを修正することはできません。

コードが正しければ、for-each全体を次のように簡略化できます。

<xsl:apply-templates select="following::node()[1][self::w:tbl][parent::w:body]"/>
于 2012-08-28T08:35:55.680 に答える