将模板应用于具有属性的子节点

发布于 2024-11-02 10:02:12 字数 1852 浏览 1 评论 0原文

我想将模板应用到具有指定属性的子节点的节点,并且我很好奇是否可以使用

因此,如果我有一个输入 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

昔日梦未散 2024-11-09 10:02:12

允许更复杂(嵌套)的谓词。使用这个:

<xsl:template match="*[desc[@src]]">

以及没有 src 属性的节点的相应模板:

<xsl:template match="*[desc[not(@src)]]">

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*[desc[@src]]"> 
        <xsl:element name="node-with-src"/>
    </xsl:template>
    <xsl:template match="*[desc[not(@src)]]">
        <xsl:element name="node"/>
    </xsl:template>
</xsl:stylesheet>

应用到:

<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>

输出:

<node-with-src/>
<node/>
<node-with-src/>

More complex (nested) predicates are allowed. Use this:

<xsl:template match="*[desc[@src]]">

And a corresponding template for the nodes without a src attribute:

<xsl:template match="*[desc[not(@src)]]">

For example:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*[desc[@src]]"> 
        <xsl:element name="node-with-src"/>
    </xsl:template>
    <xsl:template match="*[desc[not(@src)]]">
        <xsl:element name="node"/>
    </xsl:template>
</xsl:stylesheet>

Applied to:

<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>

Output:

<node-with-src/>
<node/>
<node-with-src/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文