Проблемы с преобразованием XML-документа в URL - PullRequest
1 голос
/ 05 октября 2010

РЕДАКТИРОВАТЬ: Пример теперь содержит все теги, которые находятся в моем основном документе

Привет всем!У меня просто был быстрый вопрос о XSLT.У меня есть большой XML-файл с множеством <DIMENSION_Id> узлов, вложенных друг в друга.В каждом <DIMENSION_Id> узле есть два тега SYN: <SYN>String</SYN><SYN>Integer</SYN> Я пытаюсь взять самый дальний дочерний узел каждого DIMENSION_Id и соединить его со всеми путями его предков, чтобы создать URL.

то есть

<DIMENSIONS VERSION="1.0.0">
    <DIMENSION NAME="Category" SRC_TYPE="INTERNAL">
        <DIMENSION_NODE ID="1000"/>
        <DIMENSION_Id>
            <SYN>Text</SYN>
            <SYN>Number</SYN>
            <DIMENSION_Id>
                <SYN>More Text</SYN>
                <SYN>Another Number</SYN>
            </DIMENSION_Id>
        </DIMENSION_Id>
    </DIMENSION>
</DIMENSIONS>

Я написал этот XSLT, чтобы сначала получить всю информацию от родительских узлов, а затем дочерний узел, чтобы создать полный URL.К сожалению, он только дает мне информацию о самом дальнем дочернем узле ... Я не знаю, как добавить к нему любой другой текст.(он должен читать что-то вроде: furthest-parent / close-parent / parent / item_selected)

К сожалению, все, что он делает, это дает мне значение текущего узла .... Вот XSLT, который я написал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/DIMENSION_NODE">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="@SYN" />
            <xsl:text>/</xsl:text>
            <xsl:value-of select="." />
            <xsl:value-of select="@SYN" />
            <xsl:text>/</xsl:text>
            <xsl:value-of select="." />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Заранее спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Полагаю, вам нужно это :

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

 <xsl:template match="DIMENSION_Id[not(DIMENSION_Id)]">
  <xsl:apply-templates select="(.|ancestor::DIMENSION_Id)/SYN" mode="gen"/>
 </xsl:template>

 <xsl:template match="SYN" mode="gen">
  <xsl:value-of select="concat('/',.)"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):

<DIMENSIONS VERSION="1.0.0">
    <DIMENSION NAME="Category" SRC_TYPE="INTERNAL">
        <DIMENSION_NODE ID="1000"/>
        <DIMENSION_Id>
           <SYN>Text</SYN>
           <SYN>Number</SYN>
           <DIMENSION_Id>
              <SYN>More Text</SYN>
              <SYN>Another Number</SYN>
           </DIMENSION_Id>
        </DIMENSION_Id>
</DIMENSION>
</DIMENSIONS>

желаемый, правильный результат:

/Text/Number/More Text/Another Number
1 голос
/ 05 октября 2010

РЕДАКТИРОВАТЬ : выборка ввода более близка к вопросу.

С этим входом:

<DIMENSIONS VERSION="1.0.0">
    <DIMENSION NAME="Category" SRC_TYPE="INTERNAL">
        <DIMENSION_NODE ID="1000"/>
        <DIMENSION_Id>
            <SYN>Text</SYN>
            <SYN>1</SYN>
            <DIMENSION_Id>
                <SYN>More Text</SYN>
                <SYN>2</SYN>
            </DIMENSION_Id>
        </DIMENSION_Id>
    </DIMENSION>
</DIMENSIONS>

Два варианта.

1) Применение шаблонов к предку в режиме:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="SYN[number()!=.]">
        <xsl:apply-templates select="ancestor::DIMENSION_Id" mode="output"/>
        <xsl:value-of select="concat(' ',../SYN[number()=.],'&#xA;')"/>
    </xsl:template>
    <xsl:template match="DIMENSION_Id" mode="output">
        <xsl:value-of select="concat('/',SYN[number()!=.])"/>
    </xsl:template>
</xsl:stylesheet>

2) С параметрами:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="SYN[number()!=.]">
        <xsl:param name="pPath"/>
        <xsl:value-of select="concat($pPath,' ',../SYN[number()=.],'&#xA;')"/>
    </xsl:template>
    <xsl:template match="DIMENSION_Id">
        <xsl:param name="pPath"/>
        <xsl:apply-templates>
            <xsl:with-param name="pPath"
                                select="concat($pPath,'/',SYN[number()!=.])"/>
        </xsl:apply-templates>
    </xsl:template>
</xsl:stylesheet>

Оба вывода:

/Text 1
/Text/More Text 2
0 голосов
/ 06 октября 2010

Извините за путаницу всех. Я получил некоторую помощь, и вот решение:

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

    <xsl:template match="/">
        <URLs>
            <xsl:apply-templates select="//DIMENSION_NODE"/>
        </URLs>
    </xsl:template>

    <xsl:template match="DIMENSION_NODE">
        <xsl:call-template name="getPath">
            <xsl:with-param name="currentnode" select="."/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="getPath">
        <xsl:param name="currentnode"/>
        <xsl:param name="currenttext" select="''"/>
        <xsl:param name="firstrun" select="1"/>
        <xsl:choose>
            <xsl:when test="$currentnode[parent::DIMENSION]">
                <URL>
                    <xsl:value-of select="$currenttext"/>
                </URL>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="$firstrun = 1">
                        <xsl:variable name="gettext">
                            <xsl:text>/</xsl:text>
                            <xsl:value-of select="concat($currentnode/DVAL/SYN[1],'&#x9;',$currentnode/DVAL/DVAL_ID/@ID)"/>
                        </xsl:variable>
                        <xsl:call-template name="getPath">
                            <xsl:with-param name="currentnode" select="$currentnode/.."/>
                            <xsl:with-param name="currenttext" select="concat($gettext,$currenttext)"/>
                            <xsl:with-param name="firstrun" select="0"/>
                        </xsl:call-template>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:variable name="gettext">
                            <xsl:text>/</xsl:text>
                            <xsl:value-of select="$currentnode/DVAL/SYN[1]"/>
                        </xsl:variable>
                        <xsl:call-template name="getPath">
                            <xsl:with-param name="currentnode" select="$currentnode/.."/>
                            <xsl:with-param name="currenttext" select="concat($gettext,$currenttext)"/>
                            <xsl:with-param name="firstrun" select="0"/>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Также прошу прощения за ошибки в моем XML-файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...