簡體   English   中英

XSLT 中的兄弟選擇問題

[英]Issues with sibling selection in XSLT

所以,我有一個 XML 文檔,看起來大致如下:

<root>
    <section>
        <text>A</text>
        <alt>
            <text>1</text>
        </alt>
        <text>B</text>
        <nest>
            <text>C</text>
            <alt>
                <text>3</text>
            </alt>
            <text>D</text>
        </nest>
        <text>E</text>
        <alt>
            <text>4</text>
            <text>5</text>
        </alt>
    </section>
</root>

我遇到的具體問題是alt標簽。 alt標記中的text標記是前一個兄弟的屬性。

為了清楚起見,我想要的 output 是這樣的:

[
    {"text": "A", "alternate": "1"},
    {"text": "B"},
    {"text": "C", "alternate": "3"},
    {"text": "D"},
    {"text": "E", "alternate": "4;5"}
]

也就是說,雖然nest標簽存在,但它的 function 基本上是 null。 我已經使用下面的 XSLT 腳本完成了大部分轉換:

<xsl:template match="root">
    <xsl:text>[</xsl:text>
        <xsl:apply-templates select=".//section/item|.//section/nest/item"/>
    <xsl:text>]</xsl:text>
</xsl:template>

<xsl:template match="section/item|section/nest/item">
    <xsl:text>{</xsl:text>
        <xsl:text>"text":"</xsl:text>
            <xsl:value-of select="current()"/>
        <xsl:text>"</xsl:text>

        <xsl:if test="following-sibling::alt">
            <xsl:text>, "alternate":"</xsl:text>
                <xsl:apply-templates select="alt"/>
            <xsl:text>"</xsl:text>
        </xsl:if>

        <xsl:text>}</xsl:text>
    <xsl:if test="position() != last()">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>


<xsl:template match="alt">
    <xsl:for-each select="text">
        <xsl:value-of select="current()"/>
        <xsl:if test="position() != last()">
            <xsl:text>;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

哪個運行,但實際上並不識別alt元素。 我假設這個測試有一些東西: <xsl:if test="following-sibling::alt">不太正確,但我無法弄清楚以挽救我的生命。

我嘗試了其他一些分組,但這是我最接近功能的版本。 我主要想弄清楚如何讓這個兄弟測試和遍歷工作,但我在 XSLT 方面的專業水平非常低,所以我可能只是從錯誤的角度來處理事情。

XSLT 1.0 優先。

您的 XSLT 與示例 XML 輸入不匹配。 給定示例輸入,可以使用以下方法實現所需的 output:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:text>[</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>&#10;]</xsl:text>
</xsl:template>

<xsl:template match="text">
    <xsl:text>&#10;&#9;{"text":"</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>"</xsl:text>
    <xsl:apply-templates select="following-sibling::*[1][self::alt]" mode="alt"/>
    <xsl:text>}</xsl:text>
</xsl:template>
  
<xsl:template match="alt" mode="alt">
    <xsl:text>, "alternate":"</xsl:text>
    <xsl:apply-templates mode="alt"/>
    <xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="alt/text" mode="alt">
    <xsl:value-of select="."/>
    <xsl:if test="position()!=last()">;</xsl:if>
</xsl:template>

<xsl:template match="alt/text"/>

</xsl:stylesheet>

或者更簡單:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/root">
    <xsl:text>[</xsl:text>
    <xsl:for-each select="//text[not(parent::alt)]">
        <xsl:text>&#10;&#9;{"text":"</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>"</xsl:text>
        <xsl:variable name="alt" select="following-sibling::*[1][self::alt]"/>
        <xsl:if test="$alt">
            <xsl:text>, "alternate":"</xsl:text>
            <xsl:for-each select="$alt/text">
                <xsl:value-of select="."/>
                <xsl:if test="position()!=last()">;</xsl:if>
            </xsl:for-each>
            <xsl:text>"</xsl:text>
        </xsl:if>   
        <xsl:text>}</xsl:text>
    </xsl:for-each>
    <xsl:text>&#10;]</xsl:text>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM