XSLT Отсутствует содержимое с использованием значения select - PullRequest
0 голосов
/ 12 июня 2018

ввод (я отредактировал ввод и вывод для лучшего понимания)

<csv>
<row>
    <id>a</id>
    <more>1</more>
    <stuff>123</stuff>
    <row>
        <id>1345</id>
        <stuff>dga</stuff>
    </row>
    <row>
        <id>68968</id>
        <stuff>jkjh</stuff>
    </row
</row>
<row>
    <id>b</id>
    <more>12</more>
    <stuff>asdf</stuff>
    <row>
        <id>abhz</id>
        <stuff>ghjk</stuff>
    </row>
</row>
</csv>

желаемый вывод

<csv>
    <bamboo id="a" more="1">
        <p>123</p>
    </bamboo>
    <bamboo id="1345">
        <p>dga</p>
    </bamboo>
    <bamboo id="68968>
        <p>jkjh</p>
    <bamboo id="b" more="12">
        <p>asdf</p>
    </bamboo>
    <bamboo id="abhz">
        <pghjk</p>
    </bamboo>
</csv>

моя попытка:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
    <xsl:template match="csv">
    <somelementshere>
        <text>
            <body>
                <div type="bamboopower">
                        <xsl:apply-templates select="@* | node()"/>
                </div>
            </body>
        </text>
    </somelementshere>
</xsl:template>
<xsl:template match="row">

    <bamboo id="{id}" more="{1}">
        <p><xsl:value-of select="stuff"/></p>
    </bamboo>

    <bamboo id="row/row[comment_id]">
        <p><xsl:value-of select="row/row/stuff"/></p>
    </bamboo>
</xsl:template>
</xsl:stylesheet>

мой вывод выглядиткак:

            <bamboo id="a" more="1">
                <p>123</p>
            </bamboo>
            <bamboo id="">
                <p/>
            </bamboo>
            <bamboo id="b" more="12">
                <p>123</p>
            </bamboo>
            <bamboo id="">
                <p/>
            </bamboo>

Как видите, содержимое строки / строки отсутствует.Что я делаю неправильно?Также он не прогоняет весь ряд / ряд.В строке может быть несколько дочерних строк, мне нужны все.

(мне нужно больше деталей, мой пост состоит в основном из кода.)

1 Ответ

0 голосов
/ 12 июня 2018

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

<xsl:value-of select="row/row/stuff"/>

В данный момент вы соответствуете элементу row, поэтому ваше выражение будет относительно этого, поэтому, выполнив row/row, вы получитеищем элемент grand-child под названием row.Вы действительно просто делаете <xsl:value-of select="row/stuff"/>

Это будет похоже на создание атрибута id для второго bamboo.Это должно быть так (я заменил comment_id на id, поскольку в вашем XML нет comment_id)

<bamboo id="{row/id}">

Вторая проблема заключается в том, что в вашем коде предполагается только один дочерний элемент rowэлемент, где вы можете иметь несколько.Для создания второго bamboo и последующих вы должны обернуть его в xsl:for-each

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />

<xsl:template match="csv">
    <div type="bamboopower">
        <xsl:apply-templates select="@* | node()"/>
    </div>
</xsl:template>

<xsl:template match="row">
    <bamboo id="{id}" more="{more}">
        <p><xsl:value-of select="stuff"/></p>
    </bamboo>

    <xsl:for-each select="row">
        <bamboo id="{id}">
            <p><xsl:value-of select="stuff"/></p>
        </bamboo>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" indent="yes" />

<xsl:template match="csv">
    <div type="bamboopower">
        <xsl:apply-templates select="//row"/>
    </div>
</xsl:template>

<xsl:template match="row">
    <bamboo id="{id}">
        <xsl:if test="more">
            <xsl:attribute name="more">
                <xsl:value-of select="more" />
            </xsl:attribute>
        </xsl:if>
        <p><xsl:value-of select="stuff"/></p>
    </bamboo>
</xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...