2016-05-17 1 views
1

Я получаю 0 результатов от моего выбора в моем xsl xml read. Я подозреваю, что это черта/дефис в пути элемента.xml с тире/дефис в элементе в xsl выберите

XML:

<sa-rest xmlns="http://iemfsa.tivoli.ibm.com/REST" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <status-set state="expired" action-name="Test Plan" /> 
</sa-rest> 

XSL:

<?xml version="1.0" encoding="utf-8"?> 
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
<xsl:output method="html" encoding="UTF-8" indent="yes"/> 
 
    <xsl:template match="/"> 
 
    <html> 
 
    <link rel="stylesheet" href="w3.css" /> 
 
    <head> 
 
    </head> 
 
    <body> 
 
    <table> 
 
    <tr><th>Name</th><th>State</th></tr> 
 
    <tr> 
 
    <td><xsl:copy-of select="/sa-rest/status-set/@action-name"/></td> 
 
    <td><xsl:copy-of select="/sa-rest/status-set/@state"/></td> 
 
    </tr> 
 
    </table> 
 
    </body> 
 
    </html> 
 
    </xsl:template> 
 
</xsl:stylesheet>

но результаты я получаю:

<html> 
 
<link rel="stylesheet" href="w3.css"> 
 
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head> 
 
<body><table> 
 
<tr> 
 
<th>Name</th> 
 
<th>State</th> 
 
</tr> 
 
<tr> 
 
<td></td> 
 
<td></td> 
 
</tr> 
 
</table></body> 
 
</html>

Где я иду не так?

+0

Это не имеет ничего общего с дефисами и все, что связано с * пространствами имен * - см .: http://stackoverflow.com/questions/34758492/xslt-transform-doesnt-work-until-i-remove-root-node/34762628 # 34762628 –

ответ

1

1) Вы копируя сам атрибут скорее чем получить его значение.

<xsl:copy-of select="/sa-rest/status-set/@action-name"/> должен быть <xsl:value-of select="/sa-rest/status-set/@action-name"/

2) Вы получаете доступ имена элементов, не говоря, какое пространство имен они. Добавить ссылку на пространство имен в элементе таблицы стилей (например, xmlns:rest="http://iemfsa.tivoli.ibm.com/REST"), затем префикс любых имен элементов из этого NS с этим (например, /sa-rest/status-set/@action-name будет /rest:sa-rest/rest:status-set/@action-name).

3) Этот факультативный. Я предпочитаю всегда работать в контексте; так что вместо сопоставления / в моем шаблоне я сопоставляю /* (т. е. сам корневой элемент), а затем в моих операторах выбора я обращаюсь к другим элементам относительно этого контекста (например, замените /rest:sa-rest/rest:status-set/@action-name на ./rest:status-set/@action-name).

<?xml version="1.0" encoding="utf-8"?> 
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rest="http://iemfsa.tivoli.ibm.com/REST"> 
 
<xsl:output method="html" encoding="UTF-8" indent="yes"/> 
 
    <xsl:template match="/*"> 
 
    <html> 
 
    <link rel="stylesheet" href="w3.css" /> 
 
\t <head> 
 
\t </head> 
 
\t <body> 
 
\t <table> 
 
\t <tr><th>Name</th><th>State</th></tr> 
 
\t <tr> 
 
\t <td><xsl:value-of select="./rest:status-set/@action-name"/></td> 
 
\t <td><xsl:value-of select="./rest:status-set/@state"/></td> 
 
\t </tr> 
 
\t </table> 
 
\t </body> 
 
    </html> 
 
    </xsl:template> 
 
</xsl:stylesheet>

Side Примечание

Если у вас есть предположение о проблеме, попробуйте протестировать это предположение. т. е. вы считали, что проблема вызвана дефисом; вы пытались изменить свой XML и XSLT, чтобы удалить дефисы из имен элементов и протестировать без (например, status-set ->statusset)? Это докажет или опровергнет эту теорию, гарантируя, что вы сосредоточите свое исследование на правильном месте/не тратите долгую работу на основе ложных предположений.

Надеюсь, что это поможет.

0

Попробуйте объявить пространство имен xmlns = "http://iemfsa.tivoli.ibm.com/REST" в xsl. Или указать префикс для него Xmlns: Тиволи = "HTTP ... и использование Тиволи: са-отдых/Тиволи: состояние набора и т.д. ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:tivoli="http://iemfsa.tivoli.ibm.com/REST" 
exclude-result-prefixes="tivoli> 
<xsl:output method="html" encoding="UTF 
.... 
    <tr> 
    <td><xsl:copy-of select="/tivoli:sa-rest/tivoli:status-set/@action-name"/></td> 
    <td><xsl:copy-of select="/tivoli:sa-rest/tivoli:status-set/@state"/></td> 
    </tr> 
+0

Должен быть честным, я не уверен, что вы имеете в виду. Вы имеете в виду

+1

Нет здесь или здесь: вы должны использовать префикс –

+0

В xml у вас есть xmlns =" ​​http://iemfsa.tivoli.ibm.com/REST ", что означает, что вы не может просто соответствовать sa-rest/status-set, потому что у него есть пространство имен xml, связанное с –

Смежные вопросы