在同一行中以逗号分隔两个xml元素

时间:2016-08-11 10:38:17

标签: xslt-1.0 xslt-2.0

我想要一个在xml文件上运行的xslt文件,用逗号分隔一行中的两个prod-id和article-number。这应该只发生在哪里 产品没有商品。

我输入的xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <prod-id>P16653</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <article-number>233060</article-number>
        <languagedata>
            <language>
                <languageid>en-GB</languageid>
                <buying-description>FENDI L VELOUR SWEAT PANTS BEIGE</buying-description>
                <customer-long-description>FENDI L VELOUR SWEAT PANTS BEIGE</customer-long-description>
            </language>
        </languagedata>
        <items/>
        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
    <product>
        <prod-id>P16659</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <article-number>345940</article-number>
        <languagedata>
            <language>
                <languageid>en-GB</languageid>
                <buying-description>FENDI L VELOUR SWEAT PANTS BEIGE</buying-description>
                <customer-long-description>FENDI L VELOUR SWEAT PANTS BEIGE</customer-long-description>
            </language>
        </languagedata>
        <items/>
        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
    <product>
        <prod-id>P16755</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <article-number>11060</article-number>
        <languagedata>
            <language>
                <languageid>en-GB</languageid>
                <buying-description>FENDI L VELOUR SWEAT PANTS BEIGE</buying-description>
                <customer-long-description>FENDI L VELOUR SWEAT PANTS BEIGE</customer-long-description>
            </language>
        </languagedata>
        <items>
            <item>
                <item-id>i16754</item-id>
                <item-status>CREATED</item-status>
                <validation-status>Valid</validation-status>
                <duplication-status>Unique</duplication-status>
                <content-status>New</content-status>
            </item>
        </items>
        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
    <product>
        <prod-id>P16633</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <article-number>21069</article-number>
        <languagedata>
            <language>
                <languageid>en-GB</languageid>
                <buying-description>FENDI L VELOUR SWEAT PANTS BEIGE</buying-description>
                <customer-long-description>FENDI L VELOUR SWEAT PANTS BEIGE</customer-long-description>
            </language>
        </languagedata>
        <items/>
        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
    <product>
        <prod-id>P16785</prod-id>
        <product-status>CREATED</product-status>
        <validation-status>Valid</validation-status>
        <duplication-status>Unique</duplication-status>
        <content-status>New</content-status>
        <article-number>9881061</article-number>
        <languagedata>
            <language>
                <languageid>en-GB</languageid>
                <buying-description>FENDI L VELOUR SWEAT PANTS BEIGE</buying-description>
                <customer-long-description>FENDI L VELOUR SWEAT PANTS BEIGE</customer-long-description>
            </language>
        </languagedata>
        <items>
            <item>
                <item-id>i16757</item-id>
                <item-status>CREATED</item-status>
                <validation-status>Valid</validation-status>
                <duplication-status>Unique</duplication-status>
                <content-status>New</content-status>
            </item>
        </items>
        <created-on>2016-08-12T11:30:00</created-on>
        <created-by>Administrator</created-by>
        <last-changed-on>2016-08-04T17:34:00</last-changed-on>
        <last-changed-by>ap0712</last-changed-by>
        <delete>false</delete>
    </product>
</products>

我希望输出为

P16653,233060
P16659,345940

我正在使用以下xslt,我从这个论坛得到并尝试修改它但它只给了我一个文章编号,而不是两个

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:value-of select="products/product[not(items/item)]/prod-id/concat(local-name(), ' ', .)" separator="&#10;"/>
        <xsl:value-of select="products/product[not(items/item)]/article-number/concat(local-name(), ' ', .)" separator="&#10;"/>
    </xsl:template>
</xsl:transform>

2 个答案:

答案 0 :(得分:0)

为什么你不做:

<xsl:template match="/products">
    <xsl:for-each select="product[not(items/item)]">
        <xsl:value-of select="prod-id"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="article-number"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

答案 1 :(得分:0)

当我使用

#include <QCloseEvent>
#include <QMessageBox>
void MainWindow::closeEvent(QCloseEvent *event)  // show prompt when user wants to close app
{
    event->ignore();
    if (QMessageBox::Yes == QMessageBox::question(this, "Close Confirmation", "Exit?", QMessageBox::Yes | QMessageBox::No))
    {
        event->accept();
    }

}

使用像Saxon 9这样的XSLT 2.0处理器

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:value-of select="products/product[not(items/item)]/concat(prod-id, ',', article-number)" separator="&#10;"/>
    </xsl:template>

</xsl:stylesheet>