Xml xslt传递模板匹配,并在运行时为每个值
是否可以使用单个xsl应用于具有不同根元素和select元素的多个XML?请告知。 原始xml-1:Xml xslt传递模板匹配,并在运行时为每个值,xml,xslt,Xml,Xslt,是否可以使用单个xsl应用于具有不同根元素和select元素的多个XML?请告知。 原始xml-1: <employees> <employee> <name>ABC</name> <id>123</id> <dept>sales</dept> <city>XYZ</city> </employee> </employees> 谁能推荐一下吗。谢谢。您
<employees>
<employee>
<name>ABC</name>
<id>123</id>
<dept>sales</dept>
<city>XYZ</city>
</employee>
</employees>
谁能推荐一下吗。谢谢。您可以使用
union
操作符。差不多
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="employees|customers">
<xsl:element name="doc">
<xsl:for-each select="employee|customer">
<set>
<field name="Name">
<xsl:value-of select="name"/>
</field>
<field name="Id">
<xsl:value-of select="id"/>
</field>
<xsl:if test="dept">
<field name="Department">
<xsl:value-of select="dept"/>
</field>
</xsl:if>
<field name="City">
<xsl:value-of select="city"/>
</field>
</set>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
考虑以下通用版本,该版本不涉及员工或客户,但将模板与根目录的子目录匹配:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:element name="doc">
<xsl:apply-templates select="*"/>
</xsl:element>
</xsl:template>
<xsl:template match="/*/*">
<xsl:element name="set">
<xsl:element name="field">
<xsl:attribute name="name">Name</xsl:attribute>
<xsl:value-of select="name"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">Id</xsl:attribute>
<xsl:value-of select="id"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">Department</xsl:attribute>
<xsl:value-of select="dept"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">City</xsl:attribute>
<xsl:value-of select="city"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:transform>
名称
身份证件
部门
城市
只有当所有输入文档都具有相同的层次结构时,才能重复使用相同的XSLT:示例中的表/记录/字段。
<customers>
<customer>
<name>DEF</name>
<id>456</id>
<city>DEF</city>
</customer>
</customers>
<xsl:variable name="rootElement"></xsl:variable>
<xsl:variable name="subElement"></xsl:variable>
<xsl:template match="$rootElement">
<xsl:element name="set">
<xsl:for-each select="$subElement">
FATAL ERROR: 'line 4: Error parsing XPath expression '$rootElement'.'
javax.xml.transform.TransformerConfigurationException: line 4: Error parsing XPath expression '$rootElement'.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="employees|customers">
<xsl:element name="doc">
<xsl:for-each select="employee|customer">
<set>
<field name="Name">
<xsl:value-of select="name"/>
</field>
<field name="Id">
<xsl:value-of select="id"/>
</field>
<xsl:if test="dept">
<field name="Department">
<xsl:value-of select="dept"/>
</field>
</xsl:if>
<field name="City">
<xsl:value-of select="city"/>
</field>
</set>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:element name="doc">
<xsl:apply-templates select="*"/>
</xsl:element>
</xsl:template>
<xsl:template match="/*/*">
<xsl:element name="set">
<xsl:element name="field">
<xsl:attribute name="name">Name</xsl:attribute>
<xsl:value-of select="name"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">Id</xsl:attribute>
<xsl:value-of select="id"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">Department</xsl:attribute>
<xsl:value-of select="dept"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">City</xsl:attribute>
<xsl:value-of select="city"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:transform>