Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt传递模板匹配,并在运行时为每个值_Xml_Xslt - Fatal编程技术网

Xml xslt传递模板匹配,并在运行时为每个值

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> 谁能推荐一下吗。谢谢。您

是否可以使用单个xsl应用于具有不同根元素和select元素的多个XML?请告知。 原始xml-1:

<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>