вывод текста, когда элемент отсутствует - PullRequest
1 голос
/ 05 января 2012

Могу поспорить, это простой вопрос.

Я пытаюсь стилизовать свой XML-файл с помощью XSL.И вот что я пытаюсь сделать, это то, что когда элемент в моем XML-файле отсутствует, я хочу, чтобы xsl вывел «Missin Element»

Мне удается создать строку, в которой нет данных в элементе, ното есть, когда у меня нет никаких данных в элементе, но элемент все еще существует.

Я вставляю свой XML-файл, чтобы объяснить лучше

<autoads>
    <ad>
        <type>1</type>
        <name>Honda</name>
        <model>XL 1000 V</model>
        <regyear>2001</regyear>
        <price>129900</price>
        <adtext>2001 Honda XL 1000 V, 8.900 km. hög vindruta. Pris 129.900kr,-.  </adtext>
        <addate>20020115</addate>
        <volume>1000</volume>

    </ad>
    <ad>
        <type>2</type>
        <name>Nissan</name>
        <model>Almera 1.4S</model>
        <regyear>1997</regyear>
        <price>119000</price>
        <adtext>1997 Nissan Almera 1.4S, 5 dörrar, met, 70.000 km. el.spegel/fönster, galv. kaross, c.lås, startspärr, airbag, nedfällb. baks. ABS, ute temp. R/CD, alarm, d.fäste, v.säten, s/v-hj.  EU-godk. full service, servo. Pris 119.000 kr,-.  </adtext>
        <addate>20020118</addate>
        <volume>0</volume>
        <category>5 dörrar</category>
    </ad>
</autoads>

Как вы видите, категория элемента отсутствует впервый,

Это то, что я пытаюсь вывести с помощью строки xsl, что он должен распечатать "категория отсутствует"

Спасибо за помощь.

1 Ответ

1 голос
/ 05 января 2012

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ad">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:if test="not(category)">
                <xsl:comment>category is missing</xsl:comment>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Это выводит комментарий вместо отсутствующего узла, но вы можете легко изменить его для вывода элемента или просто текста.

Для более полного решения создайте список необходимых элементов и используйте функцию document, чтобы проверить наличие каждого элемента в этом списке:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:m="m">
    <xsl:output method="xml" indent="yes"/>
    <m:req>type</m:req>
    <m:req>name</m:req>
    <m:req>model</m:req>
    <m:req>regyear</m:req>
    <m:req>price</m:req>
    <m:req>adtext</m:req>
    <m:req>addate</m:req>
    <m:req>volume</m:req>
    <m:req>category</m:req>
    <xsl:variable name="required" select="document('')/*/m:req"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ad">
        <xsl:variable name="this" select="."/>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each select="$required">
                <xsl:variable name="search"
                    select="$this/*[name()=current()]"/>
                <xsl:if test="$search">
                    <xsl:apply-templates select="$search"/>
                </xsl:if>
                <xsl:if test="not($search)">
                    <xsl:comment>
                        <xsl:value-of select="concat(., ' is missing')"/>
                    </xsl:comment>
                </xsl:if>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...