xslt在运行时传递模板匹配和for-each值

时间:2016-02-04 04:16:15

标签: xml xslt

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

<employees>
<employee>
<name>ABC</name>
<id>123</id>
<dept>sales</dept>
<city>XYZ</city>
</employee>
</employees>

的xsl:

<xsl:template match="employees">

        <xsl:element name="doc">
            <xsl:for-each select="employee">

            <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:for-each>
            </xsl:element>

    </xsl:template>

这会产生输出:

<doc>
<set>
<field name="Name">ABC</field>
<field name="Id">123</field>
<field name="Department">sales</field>
<field name="City">XYZ</field>
</set>
</doc>

我想使用相同的xsl来转换下面的xml。

<customers>
<customer>
<name>DEF</name>
<id>456</id>
<city>DEF</city>
</customer>
</customers>

我尝试使用变量并在运行时通过java程序设置root元素和for-each select元素。但它给出了错误。

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

任何人都可以建议。感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用<?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> 运算符。像

这样的东西
element = driver.find_element :id => "gmail-sign-in"
element.click

element = driver.find_element :id => "Email"
element.send_keys "exampletestemail2903@gmail.com"


input = wait.until {
  element = driver.find_element :id => "Email"
  element if element.displayed?
}
input.send_keys("exampletestemail2903@gmail.com")
if input.text == "exampletestemail2903@gmail.com"
  puts 'Correct Input'
else
  puts 'Wong Input'
end

答案 1 :(得分:0)

考虑以下通用版本,没有员工或客户的参考,但将模板与根的子项匹配:

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