将父节点添加到特定元素 xslt

Add parent node to a specific element xslt

我想select没有子节点的父节点

示例:

<root>
    <p>some text</p>
    <ol>
      <li>
         <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a>
      </li>
    </ol>
    <p> <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a> </p>
    <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a>
</root>    

期望的输出:我想向那些 <a> 标签添加一个父 <p> 标签,这些标签除了 <root>.

没有任何父标签
<root>
    <p>some text</p>
    <ol>
      <li>
         <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a>
      </li>
    </ol>
    <p> <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a> </p>
    <p> <a href="http://cowherd.com" rel="nofollow">http://cowherd.com</a> <p>
</root> 

我试过了,但没用。它在所有 <a> 标签周围添加了 <p> 标签。

 <xsl:template match="a">
  <xsl:if test="parent::*">
        <p><a>
            <!-- do not forget to copy possible other attributes -->
            <xsl:apply-templates select="@* | node()"/>
        </a></p>
</xsl:if>
    </xsl:template>

I want to add a parent <p> tag to those <a> tags which don't have any parent except <root>.

我认为归结为:

XSLT 1.0

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

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

<xsl:template match="/root/a">
    <p>
        <xsl:copy-of select="."/>
    </p>
</xsl:template>

</xsl:stylesheet>

这里有一个方法可以做到这一点:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="a[not(parent::p)]">
    <p>
      <xsl:copy-of select="."/>
    </p>
  </xsl:template>
  
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93F8dVt