|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
есть файл xml сторонней системы, это xml основанный на атрибутах, я его перевожу в файл основанный на элементах. Это мой первый опыт с xslt, по доке сделал Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
вроде понятно, бегу в циклах, сохраняю в переменных то что использую "глубже" (может как то можно и по другому, ну да ладно работает, в принципе также как если писать на алгоритмическом языке). есть инфа "ItemId" (ID товара), а вот его наименование находится вообще в другой секции файла (типа отдельно вначале перечисляются услуги с ID и наименованиями, а потом в транзакциях используют только ID), а мне нужно получить xml-плоскую таблицу, без всяких дополнительных секций и других прелестях нормализации. Так вот как подставить наименование, найти его в секции TransactionExport\StoreID\FuelData\FuelItem\@FullName (где @FuelShiftId = $p_FuelShiftId и @MainItemId= @ItemId текущего элемента)? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 14:26 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
сори за форматирование <?xml version="1.0" encoding="utf-8" ?> <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="/"> <xsl:variable name="p_PosID"> <xsl:value-of select="TransactionExport/StoreID/StoreData/@StoreId"/> </xsl:variable> <xsl:variable name="p_PosName"> <xsl:value-of select="TransactionExport/StoreID/StoreData/@StoreName"/> </xsl:variable> <TableName> <xsl:for-each select="TransactionExport/StoreID/Tenders"> <xsl:variable name="p_FuelShiftId"> <xsl:value-of select="@FuelShiftId"/> </xsl:variable> <xsl:for-each select="Tender"> <xsl:variable name="p_TenderName"> <xsl:value-of select="@TenderName"/> </xsl:variable> <xsl:variable name="p_TenderId"> <xsl:value-of select="@TenderId"/> </xsl:variable> <xsl:for-each select="TicketHeader"> <xsl:variable name="p_GlobalTransactionId"> <xsl:value-of select="@GlobalTransactionId"/> </xsl:variable> <xsl:variable name="p_StartDateTime"> <xsl:value-of select="@StartDateTime"/> </xsl:variable> <xsl:variable name="p_EndDateTime"> <xsl:value-of select="@EndDateTime"/> </xsl:variable> <xsl:for-each select="TicketLine"> <Tran> <xsl:element name="GlobalTransactionId"> <xsl:value-of select="$p_GlobalTransactionId"/> </xsl:element> <xsl:element name="TenderId"> <xsl:value-of select="$p_TenderId"/> </xsl:element> <xsl:element name="TenderName"> <xsl:value-of select="$p_TenderName"/> </xsl:element> <xsl:element name="StartDateTime"> <xsl:value-of select="$p_StartDateTime"/> </xsl:element> <xsl:element name="EndDateTime"> <xsl:value-of select="$p_EndDateTime"/> </xsl:element> <xsl:element name="PosID"> <xsl:value-of select="$p_PosID"/> </xsl:element> <xsl:element name="PosName"> <xsl:value-of select="$p_PosName"/> </xsl:element> <xsl:element name="LineId"> <xsl:value-of select="@LineId"/> </xsl:element> <xsl:element name="ItemId"> <xsl:value-of select="@ItemId"/> </xsl:element> <xsl:element name="ItemName"> <xsl:value-of select="ЧТО СЮДА ПИСАТЬ???????"/> </xsl:element> <xsl:element name="Qty"> <xsl:value-of select="@Qty"/> </xsl:element> <xsl:element name="ActualPrice"> <xsl:value-of select="@ActualPrice"/> </xsl:element> <xsl:element name="Tax"> <xsl:value-of select="@Tax"/> </xsl:element> <xsl:element name="Amount"> <xsl:value-of select="@Amount"/> </xsl:element> </Tran> </xsl:for-each> </xsl:for-each> </xsl:for-each> </xsl:for-each> </TableName> </xsl:template> </xsl:stylesheet> ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 14:28 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
да блин Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 14:29 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Может есть что то типа переменных - key-value словарей, я бы начитал в него услуг, а потом по ключу получал бы значение и подставлял? А то сдаётся мне что както не очень эфективно быдет на каждую транзакцию искать имя по всему файлу (хотя наверное кэширование разработчики библиотек xslt предусмотрели) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 14:37 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Кучно переделать атрибуты в элементы можно так: Код: xml 1. 2. 3. 4. 5. 6. 7.
По сабжу: Код: xml 1.
/TransactionExport/StoreID/FuelData/FuelItem/[@FuelShiftId = $p_FuelShiftId and @MainItemId= $p_ItemId]/@FullName ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 15:22 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Это Код: xml 1. 2. 3.
лучше записать так: Код: xml 1.
Букв меньше, код понятней. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 15:27 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
AntonariyКучно переделать атрибуты в элементы можно так: Код: xml 1. 2. 3. 4. 5. 6. 7.
По сабжу: Код: xml 1.
/TransactionExport/StoreID/FuelData/FuelItem/[@FuelShiftId = $p_FuelShiftId and @MainItemId= $p_ItemId]/@FullName Спасибо 1. ну мне не все нужно атрибуты, там много не нужных мне. 2. т.е. @ItemID нужно тоже в переменную ($p_ItemId) сохранить перед тем как использовать в запросе? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 15:47 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
сделал так Код: xml 1. 2. 3. 4. 5. 6. 7.
не работает, ругается на "[", пишет "Предполагается NodeTest .... -->[<-- ..." библиотеку использую MSXML6.dll, без ItemName работает отлично, может нужно как то экранировать []? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:52 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
1. ну мне не все нужно атрибуты, там много не нужных мне.select="@attr1|@attr2..." 2. т.е. @ItemID нужно тоже в переменную ($p_ItemId) сохранить перед тем как использовать в запросе?Или так или current() может нужно как то экранировать []?Нет, просто здесь — FuelItem/[ — не нужен слеш. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 18:54 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Как заюзать CDATA? Сделал Код: xml 1. 2. 3.
Но если в $p_TenderName есть "<" они не превращаются в "<" ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 10:46 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Да так и заюзать — <![CDATA[ ]]> ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:04 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
AntonariyДа так и заюзать — <![CDATA[ ]]> В истодном файле в значении атрибута без CDATA, со всякими дурацкими &XXX;, в итоговом файле хочу получить CDATA и все спецсимволы в натуральном виде "e; сами в нормальный сами в нормальный вид превралились, а <> не хотят получается вообще хрень <![CDATA[ООО "Бла-бла-бла &lq; .... " ]]> а надо <![CDATA[ООО "Бла-бла-бла < .... " ]]> Просто работь с файлом (не читать ридером в программе, а натурально просматривать и искать в редакторе текст) удобнее когда нет всяких &lq; а есть нормальный текст ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:13 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Много слов, мало смысла. Давай пример того, что есть и того, что надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:20 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Есть Код: xml 1.
надо Код: xml 1.
Делаю сперва Код: xml 1.
потом Код: xml 1. 2. 3.
получаю Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:54 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:56 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 12:02 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Antonariy Код: xml 1.
спасибо, отлично ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 12:54 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Вернемся к поиску значений есть запрос, он работает Код: plaintext
Может как то можно сначала собрать в переменную все FuelItem, а потом искать в них, тормозе как я понял из-за того что внутри FuelItem тоже куча элементов, и чтоб найти нужный FuelItem нужно прочитать кучу элементов, а кэширования типа нету. Из всего штук 5-10 в файле, а операций для которых они ищутся тысячи. Может можно как то запихать во временный словарь? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 13:00 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Т.к. наверное переменная должна содержать просто начение а узлы из Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
получить переменную Код: xml 1. 2. 3. 4. 5. 6. 7. 8.
и потом к ней делать xpath запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 13:10 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 14:05 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Только почемуто в результате теперь корневой элемент не просто <TableName> а Код: xml 1.
как сделать чтоб наймспейс не добавлялся, откуда он вылез в моём теге то? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 15:31 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 16:02 |
|
xml->xml xslt запрос значения атрибута по значению других атрибутов и использовать его
|
|||
---|---|---|---|
#18+
Antonariy Код: xml 1.
отлично, спасибо огромное и еще один последний вопрос и идеально будет Есть элемент Код: xml 1.
Хочу преобразовать в Код: xml 1.
И будет идеальное преобразование Как сделал названия через переменную, по твоей ссылке, все стало летать, я знал что что то должно быть, нельзя ж каждый раз сканить огромный xml. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 16:31 |
|
|
start [/forum/topic.php?fid=14&fpage=17&tid=1332499]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 234ms |
total: | 395ms |
0 / 0 |