Вот полное решение, которое переопределяет правило / шаблон идентификации для любого story
элемента, который не имеет group
дочернего элемента:
<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="story[not(group)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<group>
<sectionhead />
</group>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="group[not(sectionhead)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<sectionhead />
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
, когда этоприменяется к предоставленному документу XML (без group
):
<story>
<text>
<lines>
<l1>line</l1>
</lines>
</text>
</story>
желаемый, правильный результат:
<story>
<group>
<sectionhead/>
</group>
<text>
<lines>
<l1>line</l1>
</lines>
</text>
</story>
при применении к первому документу XML (имеющему group
, у которого нет sectionhead
потомка):
<story>
<group>
<overhead>
<l1>overhead</l1>
</overhead>
<headline>
<l1>headline</l1>
</headline>
</group>
<text>
<lines>
<l1>line</l1>
</lines>
</text>
</story>
это же преобразование снова приводит к желаемому правильному результату:
<story>
<group>
<sectionhead/>
<overhead>
<l1>overhead</l1>
</overhead>
<headline>
<l1>headline</l1>
</headline>
</group>
<text>
<lines>
<l1>line</l1>
</lines>
</text>
</story>