xslt с xpath, который получает некоторую информацию из XML-файла, не работает в JavaScript - PullRequest
1 голос
/ 06 ноября 2010

У меня есть XML-файл. Он предназначен для преобразования процессором xslt. Конкретный шаблон готов, однако он использует некоторую информацию из двух дополнительных XML-файлов. Вся информация используется для получения правильного результата.

Работает нормально, когда я открываю основной XML-файл в своем браузере. Проблема в том, что результатом является лишь фрагмент веб-сайта, это HTML-элемент, готовый для добавления в качестве дочернего элемента. Вот почему я хочу преобразовать xml с помощью процессора xslt в функции JavaScript. К сожалению, результат сделан наполовину. Все, что не нуждается в дополнительной информации из этих двух файлов xml, импортированных выражением xpath, хорошо преобразуется. Остальное в скором времени отсутствует.

JavaScript:

var xhttp = new XMLHttpRequest()
var xsltProcessor = new XSLTProcessor()
xhttp.open("GET", "contentTemplate.xsl", false)
xhttp.send()
xsltProcessor.importStylesheet(xhttp.responseXML)

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}

XSLT:

есть много вещей, я просто вставляю xslt с выражением xpath

<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>
<xsl:for-each select="$extInfo/tag">
 <option>
  <xsl:attribute name="value"><xsl:value-of select="tagName"/></xsl:attribute>
  <xsl:value-of select="description"/>
 </option>
</xsl:for-each>

и это просто отсутствует. Также как информация не была доставлена.

EDIT:

это работает в Firefox, а не в Chrome. Мне нужно улучшить это. На самом деле, я не знаю как.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Я думал, что решил проблему, однако возникла проблема в Firefox.

Тем не менее, я касаюсь Chrome моего родного браузера, поэтому я рад, что я заставил его работать в этой программе.Это изменение, которое я реализовал в JavaScript:

function talkToServer(address, synch, func) {
func = typeof(func) != 'undefined' ? func : null
xhttp.open(method, address, synch)
xhttp.onreadystatechange = func
xhttp.send()
}

function getXPath(query) {
return document.evaluate(query, xhttp.responseXML, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null)
}

function buildElement(what) {
var xmlDoc = document.implementation.createDocument("", "root", null)
xmlDoc.documentElement.appendChild(xmlDoc.createElement(what))

switch(what) {
case "windowElement":
talkToServer("tagAvailableToAdd.xml", false)
var additionalInfo = getXPath("/root/tag")
var aim = xmlDoc.documentElement.getElementsByTagName("windowElement")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))

talkToServer("cssTemplates.xml", false)
additionalInfo = getXPath("/root/*")
aim.appendChild(xmlDoc.createElement("css"));
aim = aim.getElementsByTagName("css")[0]
for(i=0;i<additionalInfo.snapshotLength;i++)
    aim.appendChild(additionalInfo.snapshotItem(i).cloneNode(true))
break;
}
var resultDocumentFragment = xsltProcessor.transformToFragment(xmlDoc, document)
return resultDocumentFragment
}

в xslt, теперь у меня есть вся информация, поэтому нет необходимости импортировать какую-либо внешнюю информацию.

Основная функция - buildElement.Я уверен, что каждый может видеть, что он делает.Его цель - предоставить что-то, что я могу "вставить" в HTML-документ.

В Chrome это работает.В Firefox говорится: «Узел не может использоваться в документе, отличном от того, в котором он был создан« code: »4», и указывает на оператор return в функции getXPath.Я не знаю, как это исправить, но кого это волнует, это просто Firefox (я знаю, что это глупо).В IE это отстой, потому что xhttp - это объект XHttpRequest, но я считаю, что когда я предоставляю ActiveX, он должен давать то, что я хочу.

Если вы считаете, что можете помочь мне с проблемой исправления, напишите комментарий.

0 голосов
/ 06 ноября 2010

xslt:

есть много вещей, я просто вставляю xslt с выражением xpath

<xsl:variable name="extInfo" select="document('tagAvailableToAdd.xml')/root"/>

<xsl:for-each select="$extInfo/tag"> 
 <option> 
  <xsl:attribute name="value"><xsl:value-of

select = "tagName" />

и это просто отсутствует.Точно так же, как никакая информация не была доставлена.

Некоторые возможные причины такого поведения :

  1. URI файла XML не являетсяправильный.Это относительный URI, и этот конкретный URI заставит процессор XSLT искать файл с именем 'tagAvailableToAdd.xml', который находится в base-uri таблицы стилей.Тем не менее, в этом случае таблица стилей получается динамически, и это означает, что она не имеет никакого базового URI.Это наиболее вероятная причина проблемы.

  2. У Javascript нет прав доступа к файлам в локальной файловой системе.

  3. Функция document() по умолчанию не разрешена процессором XSLT.

  4. Текст, содержащийся в файле, не является правильно сформированным документом XML.

  5. Верхний элемент XML-файла не имеет названия root.

Решение : укажите абсолютный URI в качестве аргумента для document() функция.

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