是否可以使用XSLT将“空”或不存在的XML转换为另一个XML?
我要做的只是在模板XML中填入几个参数。
说,我的XML看起来像:
<someTag value="someValue">someValueOrOther</someTag>
<otherTag>dynamicValue</otherTag>
如何填写这些值?
我可以生成一个空的XML文档并对其进行转换(并忽略输入),但这看起来很难看。我宁愿使用某种模板。
另外,在使用JAXB的代码中,我不喜欢这样做:
myDoc.getSomeElement().getSomethingNested().getEvenMoreNested().setFooElement("someVal");
理想情况下,我会有一个带占位符的静态XML文件或类似的东西。
答案 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文档。