我对XSL还是很陌生,我已经尝试了一段时间了,但我还是没明白。我感谢您可以给我的任何指导。
当前脚本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/ExportXML">
<xsl:apply-templates select="record" />
</xsl:template>
<xsl:template match="record">
<xsl:element name="Job">
<xsl:apply-templates select="field" />
</xsl:element>
</xsl:template>
<xsl:template match="field">
<xsl:element name="{@City}">
<xsl:value-of select="@Value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
要转换的文件:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:getDocumentByKeyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Document>
<Attributes>
<Attribute name="count">772</Attribute>
<Attribute name="duration">0:00:01.835</Attribute>
<Attribute name="mode">XML</Attribute>
<Content>
<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07">
<record>
<field name="City">Chicago</field>
<field name="State">Illinois</field>
<field name="Title">Associate Product Manager</field>
<field name="Company">My company</field>
<field name="JobDescription">That job description</field>
<field name="Email">bsanford@invalidemail.com</field>
</record>
</ExportXML>
</Content>
</Attributes>
</Document>
</ns1:getDocumentByKeyResponse>
</soapenv:Body>
</soapenv:Envelope>
预期输出:
<xml>
<Job>
<City>Chicago</City>
<State>Illinois</State>
<Title>Associate Product Manager</Title>
<Company>My company</Company>
<JobDescription>That job description</JobDescription>
<Email>bsanford@invalidemail.com</Email>
</Job>
</xml>
谢谢您的时间, 布伦特
答案 0 :(得分:0)
已解决输入XML的问题,这些问题已得到修复,以使其格式正确。输入XML仍然没有提供与namespace
元素使用的前缀ns1
关联的<getDocumentByKeyResponse>
的任何信息。
未在输出中显示数据的主要问题是由于XSL中未映射默认名称空间xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"
。该默认名称空间与<Export>
及其所有子元素相关联。要求您阅读有关XML Namespaces的一些教程以及它们为什么很重要。
话虽如此,您需要在XSLT中进行以下更改以映射名称空间。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:t="http://www.taleo.com/ws/integration/toolkit/2005/07"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="t soapenv">
使用模板前缀t
(在解决方案中使用)访问元素。由于属性@name
成为所有field
元素的元素,因此您需要相应地对其进行修复。
<xsl:template match="t:record">
<xsl:element name="Job">
<xsl:apply-templates select="t:field" />
</xsl:element>
</xsl:template>
<xsl:template match="t:field">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
答案 1 :(得分:0)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://www.w3.org/XML/2008/xsdl-exx/ns1" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:t="http://www.taleo.com/ws/integration/toolkit/2005/07"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs soapenv ns1 t"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="ns1:getDocumentByKeyResponse">
<xsl:apply-templates select="descendant::t:ExportXML"/>
</xsl:template>
<xsl:template match="t:ExportXML">
<xml>
<xsl:apply-templates select="t:record"/>
</xml>
</xsl:template>
<xsl:template match="t:record">
<xsl:for-each select="t:field">
<xsl:choose>
<xsl:when test="@name='City'">
<City>
<xsl:value-of select=".[@name='City']"/>
</City>
</xsl:when>
<xsl:when test="@name='State'">
<State>
<xsl:value-of select=".[@name='State']"/>
</State>
</xsl:when>
<xsl:when test="@name='Title'">
<Title>
<xsl:value-of select=".[@name='Title']"/>
</Title>
</xsl:when>
<xsl:when test="@name='Company'">
<Company>
<xsl:value-of select=".[@name='Company']"/>
</Company>
</xsl:when>
<xsl:when test="@name='JobDescription'">
<JobDescription>
<xsl:value-of select=".[@name='JobDescription']"/>
</JobDescription>
</xsl:when>
<xsl:when test="@name='Email'">
<Email>
<xsl:value-of select=".[@name='Email']"/>
</Email>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
You can also do it by this way