我已经尝试解决这个问题有一段时间了。
我有一个xml文件:
<ParentNode>
<RequirementGroup>
<ID>id1</ID>
<Requirement>
<ID>id2</ID>
<Description>value1</Description>
</Requirement>
<RequirementGroup pi="attribute">
<ID>id3</ID>
<Requirement>
<ID>id4</ID>
<Description>value2</Description>
</Requirement>
<Requirement>
<ID>id5</ID>
<Description>value3</Description>
</Requirement>
<Requirement>
<ID>id6</ID>
<Description>value4</Description>
</Requirement>
<Requirement>
<ID>id7</ID>
<Description>value5</Description>
</Requirement>
<RequirementGroup>
<ID>id8</ID>
<Requirement>
<ID>id9</ID>
<Description>value6</Description>
</Requirement>
<RequirementGroup pi="attribute">
<ID>id10</ID>
<Requirement>
<ID>id11</ID>
<Description>value7</Description>
</Requirement>
</RequirementGroup>
</RequirementGroup>
</RequirementGroup>
</RequirementGroup>
</ParentNode>
这是XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template name="ExampleTemplate1">
<ID>Something</ID>
<Description>example</Description>
<TypeCode>QUESTION</TypeCode>
<ValueDataTypeCode>INDICATOR</ValueDataTypeCode>
</xsl:template>
<xsl:template name="ExampleTemplate2">
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<xsl:if test="Requirement">
<xsl:for-each select="Requirement">
<Example>
<xsl:call-template name="ExampleTemplate1"/>
</Example>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template match="ParentNode/RequirementGroup">
<xsl:if test="RequirementGroup[@pi]">
<Node1>
<xsl:call-template name="ExampleTemplate2"/>
<xsl:if test="RequirementGroup[@pi]">
<Node1>
<xsl:call-template name="ExampleTemplate2"/>
<xsl:if test="RequirementGroup[@pi]">
<Node1>
<xsl:call-template name="ExampleTemplate2"/>
</Node1>
</xsl:if>
</Node1>
</xsl:if>
</Node1>
</xsl:if>
</xsl:template>
因此,我想用不同的节点名称以及相同的值来转换XML (但是现在我跳过了值部分,我只想拥有正确的节点结构)。
下面是这个转换的输出:
<?xml version="1.0" encoding="UTF-8"?>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
</Node1>
</Node1>
</Node1>
正如您在XML文件中所看到的,对于某些节点,我有多个节点组。这就是为什么,我创建了一个带有循环的模板来获得所有的模板,即使它是一个或五个。但结果不是我想要的结果。
编辑的
期望的产出是:
<?xml version="1.0" encoding="UTF-8"?>
<ParentNode xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
<ID>Something</ID>
<Description>example</Description>
<TypeCode>Something</TypeCode>
<ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
</Node1>
</Node1>
</Node1>
</ParentNode>
我共享的代码已经是可执行的,并且已经简化了.
另外,如果有更好的方法来做这件事,我想听听。因为当我以这种方式进行转换时,我不知道如何替换节点内的值。
EDIT2:
例如,XML1和XML2有不同的名称空间,用来表示它们的SchemaID、版本等等。XML1:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:espd="urn:com:grow:espd:02.00.00" xmlns:cac="urn:X-test:UBL:Pre-
award:CommonAggregate"
xmlns:ccv="urn:isa:names:specification:ubl:schema:xsd:CCV-
CommonAggregateComponents-1" xmlns:cbc="urn:X-test:UBL:Pre-
award:CommonBasic" xmlns:espd-
req="urn:grow:names:specification:ubl:schema:xsd:ESPDRequest-1"
xmlns:util="java:java.util.UUID">
XML2:
xmlns="urn:X-test:UBL:Pre-award:QualificationApplicationRequest"
xmlns:cac="urn:X-test:UBL:Pre-award:CommonAggregate" xmlns:cbc="urn:X-
test:UBL:Pre-award:CommonBasic" xmlns:espd="urn:com:grow:espd:02.00.00"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:util="java:java.util.UUID" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
XML1的示例节点:
<cbc:ID schemeID="CriteriaID" schemeAgencyID="EU-COM-GROW" schemeVersionID="1.0">
XML2示例:
<cbc:ID schemeID="CriteriaTaxonomy" schemeAgencyID="EU-COM-GROW" schemeVersionID="02.00.00">
但是,当我将名称空间从XML2复制到我的(您建议的XSLT)文件时(因为以这种方式,我认为它会自动地重新创建新的名称空间,就像在XML2中一样,不会有问题,转换就可以了)。但它有个奇怪的表情,
产出如下:
<cbc:ID xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccv-cbc="urn:isa:names:specification:ubl:schema:xsd:CCV-CommonBasicComponents-1" xmlns:cev="urn:isa:names:specification:ubl:schema:xsd:CEV-CommonAggregateComponents-1" xmlns:cev-cbc="urn:isa:names:specification:ubl:schema:xsd:CEV-CommonBasicComponents-1" xmlns:espd="urn:grow:names:specification:ubl:schema:xsd:ESPDResponse-1" xmlns:espd-cac="urn:grow:names:specification:ubl:schema:xsd:ESPD-CommonAggregateComponents-1" xmlns:espd-cbc="urn:grow:names:specification:ubl:schema:xsd:ESPD-CommonBasicComponents-1" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" schemeID="CriteriaID" schemeAgencyID="EU-COM-GROW" schemeVersionID="1.0">
在输出中,它添加节点旁边的所有命名空间。为什么?如何将所需的名称空间、版本等从一个转换到另一个?就像在XML2中一样,改变节点的姿态。
发布于 2018-01-25 01:23:48
我不能完全理解你想要什么,但从我目前掌握的情况来看,你需要一个身份模板,即
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
以及匹配RequirementGroup
和Requirement
节点的模板:
<xsl:template match="RequirementGroup">
<Node1>
<xsl:apply-templates/>
</Node1>
</xsl:template>
<xsl:template match="Requirement">
<Example>
<xsl:apply-templates/>
</Example>
</xsl:template>
xsl:apply-templates
本身是递归的。整个样式表如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="RequirementGroup">
<Node1>
<xsl:apply-templates/>
</Node1>
</xsl:template>
<xsl:template match="Requirement">
<Example>
<xsl:apply-templates/>
</Example>
</xsl:template>
<xsl:template match="ParentNode">
<ParentNode>
<xsl:apply-templates/>
</ParentNode>
</xsl:template>
</xsl:stylesheet>
只需向其添加其他模板以更改值即可。
https://stackoverflow.com/questions/48428478
复制相似问题