使用xsl进行XML转换

时间:2013-07-10 13:22:33

标签: xml xslt xsd-validation

我想使用xml基于xsd传输xsl文件,但无法按照xsd上的说明正确传输。 这是我的 xml

<abc:abcTransactionTypeXml xmlns:abc="abcTransactionType.schema.xml.google.com">
<abc:id>4</abc:id>    
<abc:abcTransactionTypeCategoryId>1</abc:abcTransactionTypeCategoryId>
<abc:description>Post ofccice</abc:description>
<abc:type>POST</abc:type>

</abc:abcTransactionTypeXml>

这里是。 xsd

 <xs:element name="abcTransactionType" type="abcTransactionType" />
    <xs:complexType name="abcTransactionType">
        <xs:sequence>
            few elements are here
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="abcTransactionTypeCategory" >
        <xs:sequence>
            <xs:element name="id" type="xs:short" minOccurs="1" maxOccurs="1"/>
            <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="type" type="xs:string" minOccurs="0" maxOccurs="1"/>


        </xs:sequence>
    </xs:complexType>

这是我的。 xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
    xmlns:abc="abcTransactionType.schema.xml.google.com"
    exclude-result-prefixes="abc"
    xmlns="abcTransactionType.schema.abc.xml.google.com"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:template match="/">
        <abcTransactionType>
            <xsl:apply-templates select="abc:abcTransactionTypeXml" />
        </abcTransactionType>       
    </xsl:template>

    <xsl:template match="abc:abcTransactionTypeXml">

        <xsl:apply-templates select="abct:abcTransactionTypeCategoryId" />
         <xsl:apply-templates select="abc:description" />
        <xsl:apply-templates select="abc:type" />
    </xsl:template>

    <xsl:template match="abc:id">
        <id>
            <xsl:value-of select="." />
        </id>
    </xsl:template>


     <xsl:template match="abc:abcTransactionTypeCategoryId">
        <abcTransactionTypeCategory>
            <id>
            <xsl:value-of select="." />
            </id>
        </abcTransactionTypeCategory>
    </xsl:template>

     <xsl:template match="abc:description">
        <abcTransactionTypeCategory>
            <description>
            <xsl:value-of select="." />
            </description>
        </abcTransactionTypeCategory>
    </xsl:template>

    <xsl:template match="abc:type">
        <abcTransactionTypeCategory>
            <type>
            <xsl:value-of select="." />
            </type>
        </abcTransactionTypeCategory>
    </xsl:template>     


</xsl:stylesheet>

这是我的输出

<abcTransactionType xmlns="abcTransactionType.schema.abc.xml.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <id>4</id>

    <abcTransactionTypeCategory>
    <id>1</id>
    </abcTransactionTypeCategory>
    <abcTransactionTypeCategory>
    <description>POST OFFICE</description>
    </abcTransactionTypeCategory>
    <abcTransactionTypeCategory>
    <type>POST</type>
    </abcTransactionTypeCategory>
    <
    </abcTransactionType>

这是我预期的输出

<abcTransactionType xmlns="abcTransactionType.schema.abc.xml.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>4</id>
<abcTransactionTypeCategory>
<id>1</id>
<description>Post Office</description>
<type>POST</type>
</abcTransactionTypeCategory>
</abcTransactionType>

我需要在 abcTransactionTypeCategory 的单个对象中 id,description,type 我尝试了很多以获得预期的输出,但没有运气,任何人都可以帮助我完成这项工作。 非常感谢。

1 个答案:

答案 0 :(得分:1)

对于第一种解决方案,只需进行少量更改。

<abcTransactionTypeCategory>的输出移至abc:abcTransactionTypeXml模板。

<xsl:template match="abc:abcTransactionTypeXml">
    <xsl:apply-templates select="abc:id" />
    <abcTransactionTypeCategory>
        <xsl:apply-templates select="abc:abcTransactionTypeCategoryId" />
        <xsl:apply-templates select="abc:description" />
        <xsl:apply-templates select="abc:type" />
    </abcTransactionTypeCategory>
</xsl:template>

然后从其他模板中删除<abcTransactionTypeCategory>

第二项改进:添加一个删除名称空间前缀abc

的模板
<xsl:template match="abc:*" >
    <xsl:element name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

现在您可以删除仅删除名称空间前缀的所有模板 因此,试试这个:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0"
    xmlns:ssat="abcTransactionType.schema.xml.google.com"
    exclude-result-prefixes="abc"
    xmlns="abcTransactionType.schema.abc.xml.google.com"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>


<xsl:template match="/">
    <abcTransactionType>
        <xsl:apply-templates select="abc:abcTransactionTypeXml" />
    </abcTransactionType>
</xsl:template>

<xsl:template match="abc:abcTransactionTypeXml">
    <xsl:apply-templates select="abc:id" />

    <abcTransactionTypeCategory>
        <xsl:apply-templates select="abc:abcTransactionTypeCategoryId" />
        <xsl:apply-templates select="abc:description" />
        <xsl:apply-templates select="abc:type" />
    </abcTransactionTypeCategory>
</xsl:template>

<xsl:template match="abc:id">
    <id>
        <xsl:value-of select="." />
    </id>
</xsl:template>


<xsl:template match="abc:abcTransactionTypeCategoryId">
        <id>
            <xsl:value-of select="." />
        </id>
</xsl:template>

<xsl:template match="abc:*" >
    <xsl:element name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

将生成以下输出:

<?xml version="1.0"?>
<abcTransactionType xmlns="abcTransactionType.schema.abc.xml.google.com" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <id>4</id>

  <abcTransactionTypeCategory>
    <id>1</id>
    <description>POST OFFICE</description>
    <type>POST</type>

  </abcTransactionTypeCategory>
</abcTransactionType>