代码之家  ›  专栏  ›  技术社区  ›  Ben Esteban

使用调用另一个XML文档的XSL转换XML

  •  0
  • Ben Esteban  · 技术社区  · 7 年前

    我正在尝试将员工ID列表从另一个XML文档动态添加到一个XML文档中。本质上,我试图构建一个XML查询,并从另一个XML结果文档中插入员工列表。

    这是员工名单。XSL调用的xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <ExportTXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:e="http://www.taleo.com/ws/so800/2009/01" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <e:User>
            <e:EmployeeID>0000000123</e:EmployeeID>
            <e:SystemUser>false</e:SystemUser>
        </e:User>
        <e:User>
            <e:EmployeeID>0000000224</e:EmployeeID>
            <e:SystemUser>false</e:SystemUser>
        </e:User>
    </ExportTXML>
    

    这是正在转换的XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <quer:query productCode="SO1015" model="http://www.taleo.com/ws/so800/2009/01" projectedClass="User" locale="en" mode="T-XML" largegraph="true" preventDuplicates="false" xmlns:quer="http://www.taleo.com/ws/integration/query"><quer:subQueries/><quer:projections><quer:projection><quer:field path="EmployeeID"/></quer:projection></quer:projections><quer:projectionFilterings/><quer:filterings><quer:filtering>
      <quer:includedIn>
        <quer:field path="EmployeeID"/>
        <quer:list>
          <!--List will be filled at runtime.-->
        </quer:list>
      </quer:includedIn>
    </quer:filtering></quer:filterings><quer:sortings/><quer:sortingFilterings/><quer:groupings/><quer:joinings/></quer:query>
    

    下面是转换XMl并调用EmployeeList的XSL。xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:quer="http://www.taleo.com/ws/integration/query" xmlns:e="http://www.taleo.com/ws/so800/2009/01" exclude-result-prefixes="e">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:param name="EMPLOYEE_FILTER">C:\temp\EmployeeList.xml</xsl:param>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
    
        <xsl:template match="/quer:query/quer:filterings/quer:filtering/quer:includedIn[quer:field[@path='EmployeeID']]/quer:list">
            <xsl:copy>
                <xsl:for-each select="document(replace($EMPLOYEE_FILTER, '\\', '/'))//e:User/e:EmployeeID">
                    <quer:string>
                        <xsl:value-of select="."/>
                    </quer:string>
                </xsl:for-each>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    输出应如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <quer:query productCode="SO1015" model="http://www.taleo.com/ws/so800/2009/01" projectedClass="User" locale="en" mode="T-XML" largegraph="true" preventDuplicates="false" xmlns:quer="http://www.taleo.com/ws/integration/query"><quer:subQueries/><quer:projections><quer:projection><quer:field path="EmployeeID"/></quer:projection></quer:projections><quer:projectionFilterings/><quer:filterings><quer:filtering>
      <quer:includedIn>
        <quer:field path="EmployeeID"/>
        <quer:list>
            <quer:string>0000000123</quer:string>
            <quer:string>0000000224</quer:string>
        </quer:list>
      </quer:includedIn>
    </quer:filtering></quer:filterings><quer:sortings/><quer:sortingFilterings/><quer:groupings/><quer:joinings/></quer:query>
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Martin Honnen    7 年前

    看来你想建造一个 file 您需要的URL,例如。 document(concat('file:///', replace($EMPLOYEE_FILTER, '\\', '/')))///e:User/e:EmployeeID 。如果辅助文档中的输入元素位于命名空间中 http://www.taleo.com/ws/integration/toolkit/2005/07 您需要申报 xmlns:e="http://www.taleo.com/ws/integration/toolkit/2005/07"