2


<p>  すべてのタグを   変換し  、これらのノードの名前を に変更してい  ます ( を使用して) 要素  に  <Body_Text>あるという条件で。 私のコードこれを行っていますが、  要素  の外側にある  すべての要素を省略し  ています。これは望ましくありません。 <body>xsl:if

<p><body>


変換する XML は次のとおりです。

<root>
<p>asdf</p>
<body>
<p>asdfasdf</p>
<p>asdfasdf</p>
</body>
<footer>
<p>asdf</p>
</footer>
</root>


... XSL は次のとおりです。

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

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

    <!-- Body_Text -->
    <xsl:template match="p">
      <xsl:if test="parent::body">
        <Body_Text>
          <xsl:apply-templates select="@*|node()"/>
        </Body_Text>
      </xsl:if>
    </xsl:template>

</xsl:stylesheet>


...そして、ここに望ましくない結果があります(  <p>  要素の外側にあるすべての要素を  省略しています<body>  。これはやりたくないことです):

<root>
<body>
<Body_Text>asdfasdf</Body_Text>
<Body_Text>asdfasdf</Body_Text>
</body>
<footer/>
</root>


これはhttp://xslt.online-toolz.com/tools/xslt-transformation.php でテストされました。


これは私が得ていない望ましい結果です:

<root>
<p>asdf</p>
<body>
<Body_Text>asdfasdf</Body_Text>
<Body_Text>asdfasdf</Body_Text>
</body>
<footer>
<p>asdf</p>
</footer>
</root>
4

1 に答える 1

2

必要ありませんxsl:if。適切なテンプレート パターンを指定するだけです。

この変換:

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

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

 <xsl:template match="body//p">
  <Body_Text><xsl:apply-templates select="@*|node()"/></Body_Text>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<root>
    <p>asdf</p>
    <body>
        <p>asdfasdf</p>
        <p>asdfasdf</p>
    </body>
    <footer>
        <p>asdf</p>
    </footer>
</root>

必要な正しい結果が生成されます。

<root>
   <p>asdf</p>
   <body>
      <Body_Text>asdfasdf</Body_Text>
      <Body_Text>asdfasdf</Body_Text>
   </body>
   <footer>
      <p>asdf</p>
   </footer>
</root>

説明:

次のテンプレート パターン:

 <xsl:template match="body//p">

pこのテンプレートは、要素の子孫である要素でのみ実行するために選択されbodyます。残りのノードはすべて、アイデンティティ ルールによって「そのまま」コピーされます。

于 2012-08-07T01:57:01.810 に答える