为输入XML编写XSLT

时间:2011-07-05 14:54:24

标签: xml xslt xpath

我有一个使用xslt转换输入xml的作业。

我输入的xml文件,

<?xml version="1.0" encoding="UTF-8"?>
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<rs:data>
    <z:row ID="1" CK="B0011" Description="VSC" DTC="B0000" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP"/>
    <z:row ID="2" CK="B0012" Description="VSC_1" DTC="B0011" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP"/>   
    <z:row ID="3" CK="B0013" Description="VSC_2" DTC="B0012" Variant="" AN="Y" Notes="" GCategory="M54" System="VOS" Ownership="EEP"/>  
    <z:row ID="4" CK="B0014" Description="VSC_3" DTC="B0013" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP"/>   
    <z:row ID="5" CK="B0015" Description="VSC_4" DTC="B0014" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP"/>   
</rs:data>
</xml>

例外的XML输出:

<DF>
<Cage Revision="" RevisionDate="" CPType="Authored" Ext_Identifier="">
    <Entities>
        <StdDTCs>
            <StdDTC Action="Insert" CK="B0011" Description  ="VSC" DTC="B0000" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP"/>
            <StdDTC Action="Insert" CK="B0012" Description  ="VSC_1" DTC="B0011" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP"/>
            <StdDTC Action="Insert" CK="B0013" Description  ="VSC_2" DTC="B0012" Variant="" AN="Y" Notes="" GCategory="M54" System="VOS" Ownership="EEP"/>
            <StdDTC Action="Insert" CK="B0014" Description  ="VSC_3" DTC="B0013" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP"/>
            <StdDTC Action="Insert" CK="B0015" Description  ="VSC_4" DTC="B0014" Variant="" AN="Y" Notes="  " GCategory="M3" System="VOS" Ownership="EEP"/>
        </StdDTCs>
        <ABCDs>
        <ABCD/>
        ...............
        ...............
        ...............
        <ABCD/>
        </ABCDs>
    </Entities>
</Cage>
</DF>

我在xslt上试了一下。

<?xml version="1.0" encoding="UTF-8"?>
     

      

<xsl:key name="UID" match="z:row/@ID" use="."/>
<xsl:template match="/">
    <DF>
        <Cage>
            <xsl:attribute name="Revision"><xsl:value-of select="''"/></xsl:attribute>
            <xsl:attribute name="RevisionDate"><xsl:value-of select="''"/></xsl:attribute>
            <xsl:attribute name="ChangePackageType"><xsl:value-of select="'Authored'"/></xsl:attribute>
            <xsl:attribute name="Ext_Identifier"><xsl:value-of select="''"/></xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </Cage>
    </DF>
</xsl:template>

<!--    <xsl:template match="rs:data">
    <Entities>
        <StandardDTCs>
            <xsl:apply-templates select="StandardDTC"/>
        </StandardDTCs>
        </Entities>
</xsl:template> -->
<xsl:template match="rs:data">
<StdDTCs>
    <StdDTC>
        <xsl:attribute name="Action"><xsl:value-of select="'Insert'"/></xsl:attribute>
        <xsl:attribute name="CK"><xsl:value-of select="z:row/@CK"/></xsl:attribute>
        <xsl:attribute name="Description"><xsl:value-of select="z:row/@Description"/></xsl:attribute>
        <xsl:attribute name="DTC"><xsl:value-of select="z:row/@DTC"/></xsl:attribute>
        <xsl:attribute name="Variant"><xsl:value-of select="z:row/@DTC"/></xsl:attribute>
        <xsl:attribute name="AN"><xsl:value-of select=""/></xsl:attribute>
        <xsl:attribute name="Notes"><xsl:value-of select=""/></xsl:attribute>
        <xsl:attribute name="GCategory"><xsl:value-of select=""/></xsl:attribute>
        <xsl:attribute name="System"><xsl:value-of select=""/></xsl:attribute>
        <xsl:attribute name="Ownership"><xsl:value-of select=""/></xsl:attribute>
    </StdDTC>
</StdDTCs>
</xsl:template>
</xsl:stylesheet>

帮我构建这个xslt。

2 个答案:

答案 0 :(得分:2)

使用此(您的解决方案略有修改):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:z="#RowsetSchema" xmlns:rs="urn:schemas-microsoft-com:rowset"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <DF>
            <Cage>
                <xsl:attribute name="Revision">
                    <xsl:value-of select="''"/>
                </xsl:attribute>
                <xsl:attribute name="RevisionDate">
                    <xsl:value-of select="''"/>
                </xsl:attribute>
                <xsl:attribute name="ChangePackageType">
                    <xsl:value-of select="'Authored'"/>
                </xsl:attribute>
                <xsl:attribute name="Ext_Identifier">
                    <xsl:value-of select="''"/>
                </xsl:attribute>
                <StdDTCs>
                    <xsl:apply-templates select="@*|node()"/>
                </StdDTCs>
            </Cage>
        </DF>
    </xsl:template>

    <xsl:template match="rs:data/z:row">
        <StdDTC Action="Insert">
            <xsl:for-each select="@*">
                <xsl:attribute name="{name()}">
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
        </StdDTC>
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>
<DF xmlns:z="#RowsetSchema" xmlns:rs="urn:schemas-microsoft-com:rowset">
    <Cage Revision="" RevisionDate="" ChangePackageType="Authored" Ext_Identifier="">
        <StdDTCs>

            <StdDTC Action="Insert" ID="1" CK="B0011" Description="VSC" DTC="B0000" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP" />
            <StdDTC Action="Insert" ID="2" CK="B0012" Description="VSC_1" DTC="B0011" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP" />
            <StdDTC Action="Insert" ID="3" CK="B0013" Description="VSC_2" DTC="B0012" Variant="" AN="Y" Notes="" GCategory="M54" System="VOS" Ownership="EEP" />
            <StdDTC Action="Insert" ID="4" CK="B0014" Description="VSC_3" DTC="B0013" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP" />
            <StdDTC Action="Insert" ID="5" CK="B0015" Description="VSC_4" DTC="B0014" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP" />

        </StdDTCs>
    </Cage>
</DF>

答案 1 :(得分:0)

这是我的猜测:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema"
    exclude-result-prefixes="z rs">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <DF>
            <Cage Revision="" RevisionDate="" CPType="Authored" Ext_Identifier="">
                <Entities>
                    <xsl:apply-templates select="rs:data"/>
                </Entities>
            </Cage>
        </DF>
    </xsl:template>

    <xsl:template match="rs:data">
        <StdDTCs>
            <xsl:apply-templates select="z:row"/>
        </StdDTCs>
    </xsl:template>

    <xsl:template match="z:row">
        <StdDTC action="Insert">
            <xsl:copy-of select="@*"/>
        </StdDTC>
    </xsl:template>

</xsl:stylesheet>

结果树是:

<DF>
    <Cage Revision="" RevisionDate="" CPType="Authored" Ext_Identifier="">
        <Entities>
            <StdDTCs>
                <StdDTC action="Insert" ID="1" CK="B0011" Description="VSC" DTC="B0000" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP" />
                <StdDTC action="Insert" ID="2" CK="B0012" Description="VSC_1" DTC="B0011" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP" />
                <StdDTC action="Insert" ID="3" CK="B0013" Description="VSC_2" DTC="B0012" Variant="" AN="Y" Notes="" GCategory="M54" System="VOS" Ownership="EEP" />
                <StdDTC action="Insert" ID="4" CK="B0014" Description="VSC_3" DTC="B0013" Variant="" AN="Y" Notes="" GCategory="M1" System="VOS" Ownership="EEP" />
                <StdDTC action="Insert" ID="5" CK="B0015" Description="VSC_4" DTC="B0014" Variant="" AN="Y" Notes="" GCategory="M3" System="VOS" Ownership="EEP" />
            </StdDTCs>
        </Entities>
    </Cage>
</DF>