我必须创建一个xslt才能对2个不同的xsd文件进行交叉,以便一个版本可以与另一个版本匹配。 我有一个带孩子的元素,其中一些孩子是可选的。在这种情况下。测试3是可选的。
<Test1>
<TestA>data</TestA>
<TestB>data</TestB>
<TestC>data</TestC>
</Test1>
<Test2>
<TestA>data</TestA>
<TestC>data</TestC>
</Test2>
现在我想看看Testb是否存在,如果不存在,我必须在正确的位置(Testa和Testc之间)添加它。 请注意,Test1已经是其他元素的子元素,我使用xsl:for-each“联系”每个元素。
有没有办法做到这一点?谢谢!
答案 0 :(得分:0)
要检查元素是否存在,可以使用xsl:if
或xsl:when
与各自的test="element_name"
。
执行任务的示例脚本如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*[matches(name(),'[a-z]+\d+','i')]">
<xsl:copy>
<xsl:variable name="curr" select="."/>
<xsl:for-each select="('A','B','C')">
<xsl:variable name="childName" select="concat('Test',.)"/>
<xsl:variable name="elem" select="$curr/*[name() = $childName]"/>
<xsl:element name="{$childName}">
<xsl:choose>
<xsl:when test="$elem">
<xsl:value-of select="$elem"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Surrogate value for </xsl:text>
<xsl:value-of select="$childName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
主要部分是与元素匹配的模板,其名称包括 字母(至少一个),然后是数字(至少一个)。
然后需要curr
变量来保留当前元素,因为
for-each
循环会对其进行更改,但我们仍然需要引用
外部当前元素。
For-each
循环安排处理任何子 Test ... 元素,
名称以A
,B
或C
结尾。
如果必需的子元素存在,则打印其值,否则 该脚本会打印相应的代理值。
可能这不是您需要的最终版本,但至少您有 一些创建最终版本的起点。