我正在努力思考 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 标签值并将其放入员工标签的属性中)。
<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>
有什么想法吗?
最佳答案
这个简短(没有明确的条件指令)转换:
<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>
关于xml - 根据另一个标签的值将属性添加到 XML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264142/