转换"空"使用XSLT的XML或:如何使用XML模板?

时间:2014-06-26 07:28:44

标签: java xml xslt

是否可以使用XSLT将“空”或不存在的XML转换为另一个XML?

我要做的只是在模板XML中填入几个参数。

说,我的XML看起来像:

<someTag value="someValue">someValueOrOther</someTag>
<otherTag>dynamicValue</otherTag>

如何填写这些值?

我可以生成一个空的XML文档并对其进行转换(并忽略输入),但这看起来很难看。我宁愿使用某种模板。

另外,在使用JAXB的代码中,我不喜欢这样做:

myDoc.getSomeElement().getSomethingNested().getEvenMoreNested().setFooElement("someVal");

理想情况下,我会有一个带占位符的静态XML文件或类似的东西。

2 个答案:

答案 0 :(得分:3)

一种(鲜为人知的)方法是使用“简化样式表”语法。

使用这样的样式表:

<root xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <fixedTag>fixed content</fixedTag>
    <someTag><xsl:value-of select="*/param1"/></someTag>
    <otherTag><xsl:value-of select="*/param2"/></otherTag>
</root>

和这样的源文件:

<params>
  <param1>Variable content 1</param1>
  <param2>Variable content 2</param2>
</params>

答案 1 :(得分:1)

如果您有模板XML文档,例如:

<root>
    <fixedTag>fixed content</fixedTag>
    <someTag>required placeholder</someTag>
    <otherTag>required placeholder</otherTag>
</root>

您可以使用样式表,例如:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="some">some dynamic content</xsl:param>
<xsl:param name="other">other dynamic content</xsl:param>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="someTag/text()">
    <xsl:value-of select="$some"/>
</xsl:template>

<xsl:template match="otherTag/text()">
    <xsl:value-of select="$other"/>
</xsl:template>

</xsl:stylesheet>

产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <fixedTag>fixed content</fixedTag>
   <someTag>some dynamic content</someTag>
   <otherTag>other dynamic content</otherTag>
</root>

请注意处理&#34;虚拟&#34;只包含以下内容的XML文档:

<root/>

并且在样式表中维护整个模板的情况不会太大。


编辑:

要向someTag添加属性,您可以制作样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="some">some dynamic content</xsl:param>
<xsl:param name="other">other dynamic content</xsl:param>
<xsl:param name="value">dynamic value</xsl:param>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="someTag">
    <someTag value="{$value}"><xsl:value-of select="$some"/></someTag>
</xsl:template>

<xsl:template match="otherTag/text()">
    <xsl:value-of select="$other"/>
</xsl:template>

</xsl:stylesheet>

请注意,这可以在不对模板XML进行任何更改的情况下工作。恕我直言,你可能会因为强迫自己并行管理两个模板而过于复杂,一个在样式表本身,另一个作为外部XML文档。