我需要基于 xpaths 在两个 xml 之间动态转换。例如,我有源 xml,它看起来像:
<Source>
<ZeroLine>
<FirstLine>
<Name>Name1</Name>
<SurName>SurName1</SurName>
</FirstLine>
<FirstLine>
<Name>Name2</Name>
<SurName>SurName2</SurName>
</FirstLine>
</ZeroLine>
<ZeroLine>
<FirstLine>
<Name>Name3</Name>
<SurName>SurName3</SurName>
</FirstLine>
<FirstLine>
<Name>Name4</Name>
<SurName>SurName4</SurName>
</FirstLine>
</ZeroLine>
</Source>
我需要将此源 xml 转换为可以具有不同结构的目标 xml。此目标 xml 结构是基于 xPath 构建的。
目标 xml 可以如下所示:
<Target>
<TargetZeroLine>
<TargetFirstLine>
<NameIdentifikator>Name1</NameIdentifikator>
<SurNameIdentifikator>SurName1</SurNameIdentifikator>
</TargetFirstLine>
<TargetFirstLine>
<NameIdentifikator>Name2</NameIdentifikator>
<SurNameIdentifikator>SurName2</SurNameIdentifikator>
</TargetFirstLine>
</TargetZeroLine>
<TargetZeroLine>
<TargetFirstLine>
<NameIdentifikator>Name3</NameIdentifikator>
<SurNameIdentifikator>SurName3</SurNameIdentifikator>
</TargetFirstLine>
<TargetFirstLine>
<NameIdentifikator>Name4</NameIdentifikator>
<SurNameIdentifikator>SurName4</SurNameIdentifikator>
</TargetFirstLine>
</TargetZeroLine>
</Target>
此示例的 XPath 规则是:
源 XPath -> 目标 Xpath
源/ZeroLine/FirstLine/Name -> 目标/TargetZeroLine/TargetFirstLine/NameIdentifikator
源/ZeroLine/FirstLine/SurName -> 目标/TargetZeroLine/TargetFirstLine/SurNameIdentifikator
我只有源 xml(xsd) 和这些 xpaths 规则,我需要动态构建将创建目标 xml 的 xslt 转换。
我可以手动编写这个 xslt,它可以像我想要的那样工作,但我需要根据不同的 xPaths 规则动态构建它。对于此示例,xslt 转换如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Source">
<xsl:element name="Target">
<xsl:apply-templates select="ZeroLine"/>
</xsl:element>
</xsl:template>
<xsl:template match="ZeroLine">
<xsl:element name="TargetZeroLine">
<xsl:apply-templates select="FirstLine"/>
</xsl:element>
</xsl:template>
<xsl:template match="FirstLine">
<xsl:element name="TargetFirstLine">
<xsl:element name="NameIdentifikator">
<xsl:value-of select="Name"/>
</xsl:element>
<xsl:element name="SurNameIdentifikator">
<xsl:value-of select="SurName"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我的问题是什么?:) 问题是如何从 xPath 为目标构建 xslt。当我知道目标 xml 的外观时,我可以手动编写此模板。
例如,我可以为此 XPath 手动编写 xslt 模板:
Target/TargetZeroLine/TargetFirstLine/NameIdentifikator
这是:
<xsl:template match="FirstLine">
<xsl:element name="TargetFirstLine">
<xsl:element name="NameIdentifikator">
<xsl:value-of select="Name"/>
</xsl:element>
</xsl:element>
</xsl:template>
但是如何编写将动态生成此 xslt 的 C# 代码?因为我不知道应该生成哪个 xsl:element... 到哪个模板。
或者问题也可以是:是否可以基于 xPath 编写 xslt xsl:element?我的意思是这样的:
<xsl:template match="FirstLine">
<xsl:element name="Target/TargetZeroLine/TargetFirstLine">
<xsl:element name="NameIdentifikator">
我希望,我的问题将是清楚的理解。
更新1
XPath 规则在源和目标之间可能不同。层次结构的级别也可以不同。例如以下 XPath 规则:
Source/ZeroLine/FirstLine/Name -> Target/NameSection/NameIdentifikator
Source/ZeroLine/FirstLine/SurName -> Target/SurNameSection/SurNameIdentifikator
应该产生以下预期的 xml:
<Target>
<NameSection>
<NameIdentifikator>Name1</NameIdentifikator>
<NameIdentifikator>Name2</NameIdentifikator>
<NameIdentifikator>Name3</NameIdentifikator>
<NameIdentifikator>Name4</NameIdentifikator>
</NameSection>
<SurNameSection>
<SurNameIdentifikator>SurName1</SurNameIdentifikator>
<SurNameIdentifikator>SurName2</SurNameIdentifikator>
<SurNameIdentifikator>SurName3</SurNameIdentifikator>
<SurNameIdentifikator>SurName4</SurNameIdentifikator>
</SurNameSection>
</Target>
谢谢。