将模板应用于具有属性的子节点
我想将模板应用到具有指定属性的子节点的节点,并且我很好奇是否可以使用
因此,如果我有一个输入 xml
<?xml version="1.0"?>
<parent-node>
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<child-node>
<label>value2</label>
<desc>description2</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
</parent-node>
所需的模板将应用于具有定义了 src
属性的 desc
子节点的节点,例如第一个和最后一个节点:
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
到目前为止,我拥有的最好的模板是与具有 desc
子节点的节点相匹配的模板,其余节点(测试是否有任何 desc
节点具有 < code>@src) 位于模板内部的 xsl:choose
子句中:
<xsl:template match="*[desc]">
<xsl:choose>
<xsl:when test="desc[@src]">
<xsl:element name="node-with-src">
[...]
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="node">
[...]
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
通过使用这样的模板,我可以保留其中的 otherwise
部分模板,无论如何,它会好很多。
预先感谢您的每一个答案!
编辑 我更喜欢 1.0 解决方案,但这不是一个标准。
I'd like to apply a template to nodes that have children with a specified attribute, and I'm curious if it's possible with a <template match=...
So if i have an input xml
<?xml version="1.0"?>
<parent-node>
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<child-node>
<label>value2</label>
<desc>description2</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
</parent-node>
the required template will be applied to the nodes that have desc
children with src
attribute defined, eg. the first and last nodes:
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
The best i have so far is a template matching the nodes that have desc
children, and the rest (testing if any of the desc
nodes have @src
) is inside the template, in an xsl:choose
clause:
<xsl:template match="*[desc]">
<xsl:choose>
<xsl:when test="desc[@src]">
<xsl:element name="node-with-src">
[...]
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="node">
[...]
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
By having such a template, i could leave but the otherwise
part inside this template, and anyway, it would be a lot nicer.
Thank you in advance for every answer!
Edit
I'd prefer a 1.0 solution, but it's not a criteria.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
允许更复杂(嵌套)的谓词。使用这个:
以及没有
src
属性的节点的相应模板:例如:
应用到:
输出:
More complex (nested) predicates are allowed. Use this:
And a corresponding template for the nodes without a
src
attribute:For example:
Applied to:
Output: