从xml

时间:2017-02-28 15:10:26

标签: xslt xslt-2.0

我有以下需要转换为文本文件的xml代码。我在XSLT中大量使用命名空间。我曾经做过导出/记录和简单的默认命名空间匹配。我有以下XML代码:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MultiCountryIntegrationService.Core.Entities.Dto">
    <Person>
        <Addresses>
            <Address>
                <City>London</City>
                <Country>GB</Country>
                <County>London</County>
                <CreatedDate xmlns:d5p1="http://schemas.datacontract.org/2004/07/System">
                    <d5p1:DateTime>2017-02-21T11:05:08.8387752Z</d5p1:DateTime>
                    <d5p1:OffsetMinutes>0</d5p1:OffsetMinutes>
                </CreatedDate>
                <DeletedDate xmlns:d5p1="http://schemas.datacontract.org/2004/07/System" i:nil="true" />
                <EndDate xmlns:d5p1="http://schemas.datacontract.org/2004/07/System" i:nil="true" />
                <Extension i:nil="true" />
                <Id>8e5b30d0</Id>
                <ModifiedDate xmlns:d5p1="http://schemas.datacontract.org/2004/07/System" i:nil="true" />
                <Number>8</Number>
                <StartDate xmlns:d5p1="http://schemas.datacontract.org/2004/07/System">
                    <d5p1:DateTime>2016-06-30T22:00:00Z</d5p1:DateTime>
                    <d5p1:OffsetMinutes>120</d5p1:OffsetMinutes>
                </StartDate>
                <Street>Somewhere</Street>
                <Type>Primary</Type>
                <ZipCode>L1 1LL</ZipCode>
            </Address>
        </Addresses>
        <PersonLocalReferences xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
    </Person>
    <Person>
        <Addresses>
            <Address>
                <City>Birmingham</City>
                <Country>ETC...</Country>
            </Address>
        </Addresses>
        <PersonLocalReferences xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
    </Person>
</ArrayOfPerson>

我的XSLT - 正如您所看到的,我已经尝试了几种方法,在google和stackoverflow上做了无数个小时。如果我从XML中删除i:xmlns,我可以使样式表起作用,但我无法更改XML。我使用Visual Studio 2016创建并运行xslt。如果我使用"@* | node()"我得到了所有东西,我只想将某些信息输出到文本文件中。

如果我运行下面的xslt,我只是得到标题和EOF,所以看起来<xsl:apply-templates select="ArrayOfPerson/Person"/>没有选择正确的数据级别。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="i">

    <xsl:output omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:call-template name="header" />

        <xsl:text>Person</xsl:text>
        <xsl:apply-templates select="ArrayOfPerson/Person"/>

        <xsl:value-of select="$newline" />
        <xsl:text>EOF</xsl:text>
    </xsl:template>

    <xsl:template match="Person">
        <xsl:value-of select="ArrayOfPerson/Person/Addresses/Address/City"/>
        <xsl:value-of select="Person/Addresses/Address/City"/>
        <xsl:value-of select="Addresses/Address/City"/>
        <xsl:value-of select="."/>
        <xsl:value-of select="$newline" />
        <xsl:text>match</xsl:text>
        <xsl:value-of select="$newline" />
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

迈克尔在评论中写道,添加xpath-default-namespace="http://schemas.datacontract.org/2004/07/MultiCountryIntegrationService.Core.Entities.Dto" 到你的xsl:stylesheet标签。

请注意,您必须包含完整命名空间。