我想使用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 我尝试了很多以获得预期的输出,但没有运气,任何人都可以帮助我完成这项工作。 非常感谢。
答案 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>