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 回答