XSLT ограничение предшествующего брата и обходной путь - PullRequest
3 голосов
/ 13 апреля 2011

У меня проблемы с предшествующим родным братом.Это действительно работает?

XSL выглядит примерно примерно так:

<stored-procedure id="search-algorithm-parent-child">
    <xsl:stylesheet version="1.0" xmlns:spbc="urn:lsapps.spbcontext" xmlns:user="http://www.lodestarcorp.com" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
        <xsl:output omit-xml-declaration="yes"/>
        <xsl:template match="node()|/|@*">
            <query name="CMNUALGPARENTCHILD">
                <sql>
                    SELECT 
                      parent.UIDALGLIBPARENTDTL as UIDPARENT,
                      parent.PARENTCHANNELID as VMCHANNELNUMBER, 
                      parent.UOMCODE as UOM, 
                      child.CHILDDCFLOW AS DCFLOW,
                    FROM
                      ##Q.NUALGLIBPARENTDTL parent,
                      ##Q.NUALGLIBCHILDDTL child 
                    WHERE 
                      child.UIDALGLIBPARENTDTL = parent.UIDALGLIBPARENTDTL
                      AND parent.UIDALGLIBRARY = '<xsl:value-of select="@UIDALGLIBRARY"/>'
                      ORDER BY UIDPARENT
                </sql>
            </query>
        </xsl:template>
    </xsl:stylesheet>
</stored-procedure>

Я не знаю, как выглядит XML, когда я передаю выше XSL в LsdbCommand в моемasp вот так :

var xmlTable5 = LsdbCommand("LSDB.search-algorithm-parent-child", PrefixParams1.valueOf());

Я предполагаю, что данные XML будут примерно такими (заказано UIDPARENT):

<CMNUALGPARENTCHILD>
  <someNode>
    <UIDPARENT>21</UIDPARENT>
    <VMCHANNELNUMBER>123</VMCHANNELNUMBER>
    <UOM>5<UOM>
    <DCFLOW>R<DCFLOW>
  </someNode>
  <someNode>
    <UIDPARENT>21</UIDPARENT>
    <VMCHANNELNUMBER>123</VMCHANNELNUMBER>
    <UOM>5<UOM>
    <DCFLOW>R<DCFLOW>
  </someNode>
  ...
</CMNUALGPARENTCHILD>

Пока что мойбеспокойство UIDPARENT .. Я уверен, что результат будет иметь следующий UIDPARENT .. (по порядку)

21
21
21
81
81
81

Теперь, в asp, я называю это

tTable5 = ProcessXsl(xmlTable5, XmlFreeFile("../zAlgorithmLibrary/AlgorithmParentChild.xslt"));

где AlgorithmParentChild.xslt просто

<x:stylesheet version="1.0"
  xmlns:x="http://www.w3.org/1999/XSL/Transform"
  xmlns:i="urn:ls-i18n-formatter"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:user="http://www.lodestarcorp.com/user"
  exclude-result-prefixes="x i ms user">

<x:param name="Portal">N</x:param>
<x:param name="Include">ALL</x:param>
<x:param name="OrderParams"></x:param>
<x:param name="FromParam"></x:param>
<x:param name="ROWPERPAGE">25</x:param>
<x:param name="AllowEdit"></x:param>

<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 
<x:template match="/">
  <table class="FormTable">
    <x:for-each select="//CMNUALGPARENTCHILD">
      <tr>
        <td>current <x:value-of select="@UIDPARENT"/></td>
        <td>previous <x:value-of select="preceding-sibling::node()/@UIDPARENT"/></td> 
        <td>next <x:value-of select="following-sibling::node()/@UIDPARENT"/></td>
      </tr>
    </x:for-each>
  </table>
</x:template>

<x:include href="../controls/MultiSortImages.xslt"/>
<x:include href="../controls/LockedColumns.xslt"/>
</x:stylesheet>

основная таблица выглядит следующим образом

current 21 previous  next 21 
current 21 previous 21 next 21 
current 21 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 21 next  

Кажется правильным для первых трех результатов ... но почему предшествующий элемент потерпел неудачу послетретья итерация?Должно быть возвращено следующее:

current 21 previous  next 21 
current 21 previous 21 next 21 
current 21 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 81 next 81 
current 81 previous 81 next  

отлично работает следующий-родной брат ... есть ли какие-либо известные ограничения предшествующего родного брата?и можете ли вы предложить какой-нибудь обходной путь?

Обратите внимание, что я также пытался добавить [position=1] или [position()] или просто [1] на previous-sibling :: node () / @ UIDPARENT, но он все еще имеет тот жерезультат ..

Пожалуйста, поймите, что я новичок в ASP, XSLT, XSL .. и что я поместил только фрагменты кода, а не весь код ..

Я просто хочу понятькак работает предшествующий брат ... его синтаксис, все в нем ..

1 Ответ

4 голосов
/ 13 апреля 2011

Как описано в спецификации W3C :

ось предшествующего брата содержит все предшествующие братья узла контекста

Что он не говорит, так это то, что он работает наоборот! Вам нужно добавить предикат [position()=1] в конец вашего XPath, например:

<?xml version="1.0" encoding="UTF-8"?>
<x:stylesheet version="1.0"
  xmlns:x="http://www.w3.org/1999/XSL/Transform"
  exclude-result-prefixes="x">
<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>   
<x:template match="CMNUALGPARENTCHILD">
  <table>
    <x:for-each select="UIDPARENT">
      <tr>
        <td>current <x:value-of select="."/></td>
        <td>previous <x:value-of select="preceding-sibling::UIDPARENT[position()=1]"/></td>
        <td>next <x:value-of select="following-sibling::UIDPARENT[position()=1]"/></td>
      </tr>
    </x:for-each>
 </table>
</x:template>
</x:stylesheet>

Я не смог заставить XSL по вашему вопросу работать. Но это работает с XML в вашем вопросе для меня.

Редактировать: Добавление в XML из исходного вопроса для справки

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