我需要一个特定的XSLT解决方案,而且我一直在努力弄清楚如何让它工作。现在我的XML结构如下
<DataX>
<DataY>
<fieldy>A</fieldy>
<fieldx>B</fieldx>
<Data1>
<field1>1</field1>
<field2>2</field2>
</Data1>
<Data2>
<field3>3</field3>
<field4>4</field4>
</Data2>
<Data3>
<field5>5</field5>
<field6>6</field6>
</Data3>
</DataY>
</DataX>
我需要做的是将<DataY> <field1> <field2>
的内容附加到内部数据字段的每个实例。不改变原始XML
喜欢这个
A B 1 2 A B 3 4 A B 5 6
就像这样,我为了清晰起见添加了空格。
我尝试了一些内心的每个陈述和其他一些事情。我没有体验过XSLT,但也许我在想它。我只是不确定如果使用for-each进行传递后如何获得A B数据。有什么想法吗?
答案 0 :(得分:5)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vPrefix">
<xsl:for-each select="/*/DataY/*[not(starts-with(name(),'Data'))]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/*/*/*[starts-with(name(),'Data')]">
<xsl:value-of select="concat($vPrefix, .)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的XML文档:
<DataX>
<DataY>
<fieldy>A</fieldy>
<fieldx>B</fieldx>
<Data1>
<field1>1</field1>
<field2>2</field2>
</Data1>
<Data2>
<field3>3</field3>
<field4>4</field4>
</Data2>
<Data3>
<field5>5</field5>
<field6>6</field6>
</Data3>
</DataY>
</DataX>
产生想要的,正确的结果(没有插入空格,因为它们是在“为了清晰”的问题中添加的):
AB12AB34AB56
答案 1 :(得分:2)
您应该开始使用此转换。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*/*">
<xsl:apply-templates select="*[2]/following-sibling::*" mode="data"/>
</xsl:template>
<xsl:template match="*" mode="data">
<xsl:value-of select="concat(../*[1],../*[2],*[1],*[2])"/>
</xsl:template>
</xsl:stylesheet>
应用于此输入时:
<DataX>
<DataY>
<fieldx>A</fieldx>
<fieldy>B</fieldy>
<Data1>
<field1>1</field1>
<field2>2</field2>
</Data1>
<Data2>
<field3>3</field3>
<field4>4</field4>
</Data2>
<Data3>
<field5>5</field5>
<field6>6</field6>
</Data3>
</DataY>
</DataX>
它产生:
AB12AB34AB56