我有如下的XML节点:
<AA title="xx">
<BB/>
<AA><title>yy</title></AA>
<AA title="zz"></AA>
</AA>
title
节点内的 AA
有时是属性,有时它是子节点。我需要把它全部装进一个节点。这意味着如果标题节点丢失,我需要创建一个并从属性中复制值。
如何使用XSL进行操作?我试图使用它,但它不起作用:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AA">
<xsl:copy>
<xsl:if test="not(/title)">
<title><xsl:valueOf select="@title"/></title>
</xsl:if>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
答案 0 :(得分:3)
xsl:valueOf
不是XSL。将其替换为xsl:value-of
。
然后转换原则上会起作用,但最终会出现重复的定义。要删除重复项,请将not(/title)
更改为not(./title)
。
这是我的完整转型:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
<xsl:template match="AA">
<xsl:copy>
<xsl:if test="not(./title)">
<title>
<xsl:value-of select="@title" />
</title>
</xsl:if>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>