使用不同的元素为多个XML创建XSL

时间:2014-03-21 20:19:03

标签: xml xslt xpath

我一直在寻找为多个XML创建一个XSL .Below是示例XML,它是众多XML之一。区别在于<ItemRequest>代替<m.Currency>还有其他元素。我只需要显示ItemRequest,它应该与所有XML兼容。

<?xml version="1.0" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl" ?>
<ServiceRequest xmlns:m="urn:messages.service.com"
    xmlns="urn:control.services.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RequestHeader>
        <Service>Blah</Service>
        <Operation>Blah1</Operation>
    </RequestHeader>
    <m:ItemRequest>
        <ServiceRequest xmlns="urn:control.com" xmlns:m="urn:messages.service.com" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <RequestHeader>
                <Service>Blah</Service>
                <Operation>Blah2</Operation>
            </RequestHeader>
            <m:Currency>
                <m:MaintType>a</m:MaintType>
                <m:BackOffice>b</m:BackOffice>
                <m:Code>c</m:Code>
                <m:Number>%00</m:Number>
                <m:EditCode>1</m:EditCode>
            </m:Currency>
        </ServiceRequest>
    </m:ItemRequest>
</ServiceRequest>  

输出:与

类似的东西
<h1>Operation: Currency</h1>

<table>
    <tr>
        <td>MainType</td>
        <td>BackOffice</td>
        <td>Code</td>
        <td>Number</td>
        <td>EditCode</td>
    </tr>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
        <td>%00</td>
        <td>1</td>
    </tr>
</table>

1 个答案:

答案 0 :(得分:0)

由于XML源的不同部分有两个默认命名空间,因此我将每个命名空间映射到不同的前缀:外部命名空间为ns1,内部命名空间为ns2。我使用了忽略部分节点层次结构的XPath表达式。这适用于您发布的输入XML(从m:Currency提取数据):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:ns1="urn:control.services.com" 
    xmlns:ns2="urn:control.com"
    xmlns:m="urn:messages.service.com" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output indent="yes" method="html"/>

    <xsl:template match="/">
        <html>
            <body>
                <h1><xsl:value-of select="ns1:ServiceRequest/m:ItemRequest//ns2:Operation"/></h1>
                <xsl:apply-templates select="ns1:ServiceRequest/m:ItemRequest//m:Currency"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="m:Currency">
        <table>
            <tr><xsl:apply-templates select="*" mode="headers"/></tr>
            <tr><xsl:apply-templates select="*" mode="data"/></tr>
        </table>
    </xsl:template>

    <xsl:template match="m:Currency/*" mode="headers">
        <td><xsl:value-of select="substring-after(name(.), ':')"/></td>
    </xsl:template>

    <xsl:template match="m:Currency/*" mode="data">
        <td><xsl:value-of select="."/></td>
    </xsl:template>

</xsl:stylesheet>

你说m:Currency只是一个例子,你还有其他元素。此XSL仅适用于该示例。如果您在问题中添加一个描述您接受的其他输入的XML Schema,则可以为其他方案编写样式表。