Применить шаблон к узлам, у которых есть дети с атрибутом - PullRequest
3 голосов
/ 20 апреля 2011

Я хотел бы применить шаблон к узлам, у которых есть дочерние элементы с указанным атрибутом, и мне любопытно, возможно ли это с <template match=...

Так что, если у меня есть вход 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>

требуемый шаблон будет применен к узлам, у которых есть desc дочерние элементы с определенным атрибутом src, например. первый и последний узлы:

<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 узлов имеет @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, но это не критерий.

1 Ответ

5 голосов
/ 20 апреля 2011

Допускаются более сложные (вложенные) предикаты. Используйте это:

<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/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...