美好的一天!
我正在尝试构建一个xsl转换文件来执行下一步:
有一个元素有一堆Character特征的子元素。他们每个人都有自己独特的名字。 我还有一个列表,描述了一些名称和某些命名的特征集(称为数据集)之间的逻辑连接:
CharacteristicsName:DatasetName
----------------------------
Att1_DS1:DS1
Att2_DS1:DS1
Att1_DS2:DS2
Att2_DS2:DS2
我必须转换xml,因此主元素应该获得类型为<Dataset>
的新元素。如果列出的特征名称出现在源文档中,则应显示带有表中ID的数据集。然后将相应的特征复制到这些数据集元素/
如果表格中没有列出某些特征名称,那么它应该放在ID为“其他”的数据集中
源XML:
<Object>
<ID>Obj1</ID>
<!--DS1-->
<Characteristic>
<Name>Att1_DS1</Name>
<Value>25</Value>
</Characteristic>
<!--DS2-->
<Characteristic>
<Name>Att1_DS2</Name>
<Value>25</Value>
</Characteristic>
<!--DS1-->
<Characteristic>
<Name>Att2_DS1</Name>
<Value>ABC</Value>
</Characteristic>
<!--DS2-->
<Characteristic>
<Name>Att2_DS2</Name>
<Value>ABC</Value>
</Characteristic>
<!--Other-->
<Characteristic>
<Name>Att3_NN</Name>
<Value>25</Value>
</Characteristic>
</Object>
应该转换为:
<Object>
<ID>Obj1</ID>
<Dataset id="DS1">
<Characteristic>
<Name>Att1_DS1</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS1</Name>
<Value>ABC</Value>
</Characteristic>
</Dataset>
<Dataset id="DS2">
<Characteristic>
<Name>Att1_DS1</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS1</Name>
<Value>ABC</Value>
</Characteristic>
</Dataset>
<Dataset id="Other">
<Characteristic>
<Name>Att3_NN</Name>
<Value>25</Value>
</Characteristic>
</Dataset>
</Object>
你能帮我做这些吗?我应该采取哪些方向或想法?
答案 0 :(得分:0)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:datasets>
<ds>
<id>DS1</id>
<n>Att1_DS1</n>
<n>Att2_DS1</n>
</ds>
<ds>
<id>DS2</id>
<n>Att1_DS2</n>
<n>Att2_DS2</n>
</ds>
<ds>
<id>other</id>
<n>Att3_NN</n>
</ds>
</my:datasets>
<xsl:variable name="vDS" select="document('')/*/my:datasets/*"/>
<xsl:template match="/*">
<Object>
<xsl:copy-of select="ID"/>
<xsl:apply-templates select=
"$vDS[n = current()/Characteristic/Name]">
<xsl:with-param name="pChars" select="Characteristic"/>
</xsl:apply-templates>
</Object>
</xsl:template>
<xsl:template match="ds">
<xsl:param name="pChars"/>
<Dataset id="{id}">
<xsl:copy-of select="$pChars[Name = current()/n]"/>
</Dataset>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<Object>
<ID>Obj1</ID>
<Characteristic>
<Name>Att1_DS1</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att1_DS2</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS1</Name>
<Value>ABC</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS2</Name>
<Value>ABC</Value>
</Characteristic>
<Characteristic>
<Name>Att3_NN</Name>
<Value>25</Value>
</Characteristic>
</Object>
生成想要的正确结果:
<Object>
<ID>Obj1</ID>
<Dataset id="DS1">
<Characteristic>
<Name>Att1_DS1</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS1</Name>
<Value>ABC</Value>
</Characteristic>
</Dataset>
<Dataset id="DS2">
<Characteristic>
<Name>Att1_DS2</Name>
<Value>25</Value>
</Characteristic>
<Characteristic>
<Name>Att2_DS2</Name>
<Value>ABC</Value>
</Characteristic>
</Dataset>
<Dataset id="other">
<Characteristic>
<Name>Att3_NN</Name>
<Value>25</Value>
</Characteristic>
</Dataset>
</Object>