有没有办法在xslt中处理多个输入xmls?

时间:2014-04-28 14:13:44

标签: xml xslt input

是否可以使用XSLT完成以下工作?意味着我将源XML和MAP xml加载到XSLT中。在XSLT中,没有任何硬编码值,我应该能够读取地图xml并在源xml上应用相同的内容。

请做好必要的事。

必须转换的源XML

<Book>
        <Title>C</Title>
        <Aurthor>BalaGuru samy</Aurthor>
        <Publisher>Publisher Name</Publisher>
</Book>

映射XML

<RootElement OrginalName="Book" ToTransform="C_BOOKS">
        <ChildElement OrginalName="Title" ToTransform="C_TITLES"/>
        <ChildElement OrginalName="Aurthor" ToTransform="C_AURTHOR"/>
        <ChildElement OrginalName="Publisher" ToTransform="C_PUBLISHER"/>
</RootElement>

输出XML应为:[转换后]

<C_BOOKS>
      <C_TITLES> C </C_TITLES>
      <C_AURTHOR>Balaguru samy</C_AURTHOR>
      <C_PUBLISHER>Publisher name</C_PUBLISHER>
</C_BOOKS>

先谢谢, Kannan Mohan

1 个答案:

答案 0 :(得分:0)

您可以将 map.xml 声明为XSLT样式表,并将其用于转换。例如,您可以像这样编写 map.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="Book">
        <C_BOOKS>
            <xsl:apply-templates/>
        </C_BOOKS>
    </xsl:template>

    <xsl:template match="Title">
        <C_TITLES><xsl:apply-templates/></C_TITLES>
    </xsl:template>

    <xsl:template match="Aurthor">
        <C_AURTHOR><xsl:apply-templates/></C_AURTHOR>
    </xsl:template>

    <xsl:template match="Publisher">
        <C_PUBLISHER><xsl:apply-templates/></C_PUBLISHER>
    </xsl:template>

</xsl:stylesheet>

通过使用它,您将获得您期望的结果。

由于您的问题是关于多个输入,您可以使用document()函数处理。使用您的示例,您还可以加载map.xml文件并创建更简单的样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:variable name="map" select="document('map.xml')"/>

    <xsl:template match="*">
        <xsl:variable name="tag-name" select="name(.)" />
        <xsl:element name="{$map//*[@OrginalName = $tag-name]/@ToTransform}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

如果要将map.xml文件加载到变量中,并使用该变量搜索具有名为OrginalName的属性的任何标记,请将其与当前节点进行比较,并将该标记替换为相应的ToTransform属性中的名称。 xsl:element标记创建一个名为传递属性的新元素。 {...}表达式是属性值模板。其中的表达式将生成一个值,该值是元素的名称。

这很简单,但仍然不是很强大。最好是检查标记是否受支持,并决定在找到不支持的标记时该怎么做(忽略,使用默认标记结果)。如果在map.xml文件中找不到源中的标记,则它将失败并显示错误。