2015-03-23 3 views
0

Скажи это мой XML:XSL запрос внутренний XML

<History> 
    <University>TSU</University> 
    <Payload> 
     <Attrib Order="0">OVERSEA</Attrib> 
     <Attrib Order="1">GRADE2</Attrib> 
     <Attrib Order="2">&lt;Person&gt;&lt;ID&gt;TQR344&lt;/ID&gt;&lt;/Person&gt;</Attrib> 
     <Attrib Order="3">3566644</Attrib> 
    </Payload> 
</History> 

И я хочу, чтобы запросить внутренний XML внутри Order = 2 тега и читать идентификатор пользователя.

Я создал это до сих пор:

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

    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" /> 

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

    <xsl:template name="Person" match="//History"> 
     <Event> 
      <Uni><xsl:value-of select="University" /></Uni> 
      <ID><xsl:value-of select="Payload/Attrib[@Order='2']/Person/ID" disable-output-escaping="yes" /></ID> 
     </Event> 
    </xsl:template> 
</xsl:stylesheet> 

Но как вы можете видеть, что это не работает.

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

Можно ли это сделать через xsl?

Ограничения: я не могу изменить формат xml. Но, возможно, мне удалось перейти от xsl ver 1 к новым версиям.

ответ

1

Я хочу, чтобы запросить внутренний XML внутри ордена = 2 метки

Тег в вопросе делает не содержать любой XML; его содержимое является строкой и должно управляться с помощью строковых функций. Попробуйте:

XSLT 1,0

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

<xsl:template match="/History"> 
    <Event> 
     <Uni> 
      <xsl:value-of select="University" /> 
     </Uni> 
     <ID> 
      <xsl:value-of select="substring-before(substring-after(Payload/Attrib[@Order='2'], '&lt;ID&gt;'),'&lt;/ID&gt;&lt;')"/> 
     </ID> 
    </Event> 
</xsl:template> 

</xsl:stylesheet> 

Примечание:

1. Это:

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

создает бесконечный цикл и приведет к краху вашего процессора.

2. В качестве альтернативы, вы можете сериализовать строку обратно в XML и обрабатывать результат в XML; в XSLT 1.0 это можно сделать только путем вывода строки с отключенным экранированием, сохранения результата как нового документа, а затем обработки нового документа с помощью другой таблицы стилей XSLT. Используя XSLT 3.0 (или процессор, который поддерживает сериализацию как расширение), это может быть сделано во время одного и того же преобразования.

+0

Спасибо, Майкл. Хорошая идея. Я рассматриваю это как строку. Не могли бы вы дать мне подсказку, как загрузить этот внутренний текст в виде XML и запросить его в XSLT 3.0? –

+0

@ S.C. См. Демонстрацию здесь: http://xsltransform.net/bdxtqi –