XSL - получить отличительный на основе документа XML и сопоставления ввода XML - PullRequest
1 голос
/ 20 октября 2011

Я имею в виду XML-файл (document.xml) через функцию документа. Исходя из значения входного идентификатора xml, я беру соответствующее значение из document.xml. Выход будет иметь это соответствующее значение и позицию на входе, как показано в actualoutput.xml. Тем не менее, хотелось бы сгенерировать выходной xml, как ожидаетсяOutput.xml, имеющий атрибуты Value. Может ли кто-нибудь указать, как изменить мой xsl-файл для получения ожидаемого выхода.xml?

ниже находятся файлы XslFile.xsl

<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <result>
            <xsl:apply-templates select="/*/id"/>
        </result>
    </xsl:template>
    <xsl:template match="id">
        <xsl:variable name="currencydetails" select="document('document.xml')/doc"/>
        <xsl:variable name="id">
            <xsl:value-of select="."/>
        </xsl:variable>
        <mapValue>
            <xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
            <xsl:value-of select="$fromDocument"/>
        </mapValue>
        <position>
            <xsl:value-of select="position()"/>
        </position>
    </xsl:template>
</xsl:stylesheet>

document.xml

    <doc>
   <id value="123">abc</id>
   <id value="456">abc</id>
   <id value="011">def</id>
   <id value="rty">ghj</id>
   <id value="iop">qwd</id>
   <id value="321">ply</id>
</doc>

Input.xml

    <Root>
   <id>123</id>
   <id>321</id>
   <id>897</id>
   <id>011</id>
   <id>456</id>
</Root>

actualoutput.xml - я могу добраться только до сюда

    <result>
   <mapValue>abc</mapValue>
   <position>1</position>
   <mapValue>ply</mapValue>
   <position>2</position>
   <mapValue/>
   <position>3</position>
   <mapValue>def</mapValue>
   <position>4</position>
   <mapValue>abc</mapValue>
   <position>5</position>
</result>

Ожидаемый выход.xml - что я хочу

    <result>
   <map Value="abc">
      <position>1</position>
      <position>5</position>
   </map>
   <map Value="nomatch">
      <position>3</position>
   </map>
   <map Value="def">
      <position>4</position>
   </map>
   <map Value="ply">
      <position>2</position>
   </map>
</result>

Спасибо. Я буду читать больше о функции xsl: number и position ()

Однако для вышеуказанного решения я получаю ответ ниже. Не могли бы вы направить / помочь мне. Вывод должен быть отображен на основе значения «fromdocument».

<result>
    <map value="abc"/>
    <position>1</position>
    <map value="ply"/>
    <position>6</position>
    <map value=""/>
    <position/>
    <map value="def"/>
    <position>3</position>
    <map value="abc"/>
    <position>2</position>
</result>

1 Ответ

1 голос
/ 20 октября 2011

Изменение

<mapValue>
    <xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
    <xsl:value-of select="$fromDocument"/>
</mapValue>

до

<xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
<map value="{$fromDocument}"/>

Изменить

<position>
    <xsl:value-of select="position()"/>
</position>

до

<position>
    <xsl:number select="$fromDocument"/>
</position>

или в XSLT 1.0,

<position>
    <xsl:for-each select="$fromDocument">
        <xsl:number/>
    </xsl:for-each>
</position>

(Вы один из многих, кто неправильно угадал, какую позицию () выполняет, не читая спецификацию).

И (стилистическое и улучшение производительности) изменить

<xsl:variable name="id">
    <xsl:value-of select="."/>
</xsl:variable>

до

<xsl:variable name="id" select="."/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...