XSLT, обрабатывать элементы один за другим - PullRequest
0 голосов
/ 01 июня 2010

Я довольно слаб в XSLT, так что это может показаться очевидным. Вот пример XML

 <term>
  <name>cholecystocolonic fistula</name> 
  <definition>blah blah</definition> 
  <reference>cholecystocolostomy</reference> 
  </term>

А вот XSLT, который я недавно написал для его обработки

<xsl:template name="term">
    {
    "dictitle": "<xsl:value-of select="name" disable-output-escaping="yes" />",
    "html": "<xsl:value-of select="definition" disable-output-escaping="yes"/>",
    "reference": "<xsl:value-of select="reference" disable-output-escaping="yes"/>
}
</xsl:template>

По сути, я создаю JSON из XML.

Требования теперь изменились, и теперь XML может иметь более одного тега определения и ссылочного тега. Они могут появляться в любом порядке: определение, ссылка, ссылка, определение, ссылка.

Как я могу обновить XSLT, чтобы приспособиться к этому? Вероятно, стоит упомянуть, что, поскольку мой процессор XSLT использует .NET, я могу использовать только команды XSLT 1.0.

Большое спасибо!

РЕДАКТИРОВАТЬ - Уточнение

Это тот тип JSON, который я хотел бы создать, учитывая следующий пример XML

 <term>
  <name>cholecystocolonic fistula</name> 
  <definition>blah blah</definition> 
  <reference>cholecystocolostomy</reference>
  <definition>XSLT is not as easy as it should be</definition>
  <reference>qui</reference> 
  </term>

{
    dictitle: "cholecystocolonic fistula",
    html: "blah blah",
    reference: "cholecystocolostomy",
    html: "XSLT is not as easy as it should be",
    reference: "qui"
}

Ответы [ 3 ]

3 голосов
/ 01 июня 2010

Имена свойств JSON должны быть уникальными, поэтому у вас не может быть нескольких «ссылочных» свойств, как вы наметили.

XML не имеет этого ограничения; вам разрешено иметь несколько «ссылочных» узлов на одном уровне.

http://metajack.im/2010/02/01/json-versus-xml-not-as-simple-as-you-think/

0 голосов
/ 01 июня 2010

Квай,

Это должно сгенерировать JSON, который вы хотите, но, к сожалению, вывод неправильный JSON ...

    <xsl:template match="/term">
    {
            <xsl:apply-templates select="*"/>
    }
    </xsl:template>

    <xsl:template match="name">
            "dictitle": "<xsl:value-of select="." disable-output-escaping="yes" />",
    </xsl:template>
    <xsl:template match="definition">
            "html": "<xsl:value-of select="." disable-output-escaping="yes"/>",
    </xsl:template>
    <xsl:template match="reference">
            "reference": "<xsl:value-of select="." disable-output-escaping="yes"/>
    </xsl:template>
0 голосов
/ 01 июня 2010

Вам нужно будет использовать элемент for-each.

Это даст вам массив всех ссылочных элементов:

"references": [
    <xsl:for-each select="reference">
        <xsl:if test="position() &gt; 1">,</xsl:if>
        "<xsl:value-of select="." disable-output-escaping="yes" />"
    </xsl:for-each>
]

Как видите, я добавил [] для массива и использовал элемент for-each внутри. Выбор значения . возвращает содержимое текущего узла. Выход будет (примерно):

"references": ["foo", "bar", "baz"]

Если эта структура JSON не та, которую вы хотите, сообщите мне.

EDIT:

Если вы хотите сохранить порядок, вам придется немного изменить структуру JSON:

"refsAndDefs": [
    <xsl:for-each select="reference|definition">
        <xsl:if test="position() &gt; 1">,</xsl:if>
        "<xsl:value-of select="name()" />": "<xsl:value-of select="." disable-output-escaping="yes" />"
    </xsl:for-each>
]

И результатом будет что-то вроде

"refsAndDefs": [
    {"reference": "foo"},
    {"definition": "bar"},
    {"definition": "baz"},
    {"reference": "baa"}
]

и так далее.

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