我正在努力绕过xslt ...尝试转换以下xml:
<employees>
<employee>
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<activeFlag>true</activeFlag>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
进入此(即取出activeFlag标记值并将其放入employee标记的属性中)。
<employees>
<employee active="true">
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
我尝试了以下XSLT,但它什么也没做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="employees/employee">
<employee active="{activeFlag}"/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有什么想法吗?
答案 0 :(得分:3)
此XSLT 1.0样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employee">
<xsl:copy>
<xsl:if test="activeFlag">
<xsl:attribute name="active"><xsl:value-of select="activeFlag"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="activeFlag"/>
</xsl:stylesheet>
应用于您的示例XML产生:
<employees>
<employee active="true">
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
如果您确定xsl:if
将存在,或者您不关心是否创建该属性,则可以删除activeFlag
。
此外,样式表无效的原因是您没有在employees/employee
匹配中应用模板。你也可以使用这个模板:
<xsl:template match="employees/employee">
<employee active="{activeFlag}">
<xsl:apply-templates/>
</employee>
</xsl:template>
答案 1 :(得分:3)
这个简短而简单(没有明确的条件指令)转换:
<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="employee">
<employee active="{activeFlag}">
<xsl:apply-templates select="node()|@*"/>
</employee>
</xsl:template>
<xsl:template match="activeFlag"/>
</xsl:stylesheet>
应用于提供的XML文档:
<employees>
<employee>
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<activeFlag>true</activeFlag>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
生成想要的正确结果:
<employees>
<employee active="true">
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
解释:覆盖 identity rule ,使用 AVT 。
如果您想要正确处理不存在activeFlag
子项的情况,则会稍微复杂一些:
<xsl:template match="employee">
<employee active=
"{concat(activeFlag,
substring('false',
1 div not(activeFlag))
)
}">
<xsl:apply-templates select="node()|@*"/>
</employee>
</xsl:template>