XSL脚本问题

时间:2018-08-03 22:03:28

标签: xml xslt xslt-2.0

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

谢谢您的时间, 布伦特

2 个答案:

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