powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Преобразование xml в xml с помощью XSLT не выводить пустые теги
5 сообщений из 5, страница 1 из 1
Преобразование xml в xml с помощью XSLT не выводить пустые теги
    #40012299
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Преобразую один XML документ в другой. На выходе , если нет тегов в исходном документе, в выходном получаются пустые. Есть способ убрать их все за раз, чтобы не менять XSLT для каждого элемента?
Исходный XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet  type='text/xml' href=prim11.xsl'?>                                                      
 <P_HEAD>                                                             
  <NUM_P>12345678-1000-1-5</NUM_P>                                  
  <NAM_BANK>БАНК</NAM_BANK>                      
  <NAM_U>Акционерная компания</NAM_U>         
  <INN>1234567890</INN>                                 
  <KPP>123456789</KPP>  
  <NUM_OLD>98765431-1111-2-1</NUM_OLD>      
  <PRZ_I>1</PRZ_I>
  <SYSDATE1>20200828</SYSDATE1> 
 </P_HEAD>   


Преобразрвание

Код: 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.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
<?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" indent="yes"/>

<xsl:template match="/">	
	<xsl:for-each select="//P_HEAD">
		<xsl:apply-templates select="PRZ_I"/>
	</xsl:for-each>
</xsl:template>

<xsl:template match="PRZ_I">
	<xsl:if test=". = 1">
		<xsl:choose>
        <xsl:when test="//SYSDATE1 &lt; 20201001">
        <dep:DPasp xmlns:dep="urn:Information:CommercialFinanceDocuments">			
            <dep:BankName>
                <xsl:choose>
                    <xsl:when test="string-length(//NAM_B) &gt; 150">
                        <xsl:value-of select="substring(//NAM_B,1,150)"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="//NAM_B"/>
                    </xsl:otherwise>
                </xsl:choose>
            </dep:BankName>
		<dep:DPNumber>
			<xsl:for-each select="//NUM_P">
				<dep:Part1>
					<xsl:value-of select="substring(.,1,8)"/>
				</dep:Part1>
				<dep:Part2>
					<xsl:value-of select="substring(.,10,4)"/>
				</dep:Part2>
				<dep:Part3>
					<xsl:value-of select="substring(.,15,1)"/>
				</dep:Part3>
				<dep:Part4>
					<xsl:value-of select="substring(.,17,1)"/>
				</dep:Part4>
			</xsl:for-each>			
			    <dep:PDate>
				    <xsl:value-of select="//DAT_P"/>
			    </dep:PDate>
		</dep:DPNumber>        
		<xsl:for-each select="//NUM_OLD">
			<xsl:if test="string-length(.) = 18">
				<dep:AnotherPNumber>
					<dep:Part1>
						<xsl:value-of select="substring(.,1,8)"/>
					</dep:Part1>
					<dep:Part2>
						<xsl:value-of select="substring(.,10,4)"/>
					</dep:Part2>
					<dep:Part3>
						<xsl:value-of select="substring(.,15,1)"/>
					</dep:Part3>
					<dep:Part4>
						<xsl:value-of select="substring(.,17,1)"/>
					</dep:Part4>
				</dep:AnotherPNumber>
			</xsl:if>
		</xsl:for-each>		
		<dep:Resident>
            <xsl:for-each select="//NAM_U">
                <OrganizationName>
                <xsl:choose>
                    <xsl:when test="string-length(.) &gt; 150">
                        <xsl:value-of select="substring(.,1,150)"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="."/>
                    </xsl:otherwise>
                </xsl:choose>
                </OrganizationName>
            </xsl:for-each>
            <xsl:if test="//OGRN or //INN or //KPP">
                <Organizations>
                    <xsl:for-each select="//OGRN">
                        <OGRN><xsl:value-of select="."/></OGRN>
                    </xsl:for-each>
                    <xsl:for-each select="//INN">
                        <INN><xsl:value-of select="."/></INN>
                    </xsl:for-each>
                    <xsl:for-each select="//KPP">
                        <KPP><xsl:value-of select="."/></KPP>
                    </xsl:for-each>
                </Organizations>
            </xsl:if>
         
                <dep:RegDate>
                    <xsl:value-of select="//DAT_OGRN"/>
                </dep:RegDate>
            
		</dep:Resident>		
		</dep:DPasp>
		</xsl:when>
		 </xsl:choose>
	</xsl:if>
</xsl:template>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<dep:DPasp xmlns:dep="urn:Information:CommercialFinanceDocuments">
	<dep:BankName></dep:BankName>
	<dep:DPNumber>
		<dep:Part1>12345678</dep:Part1>
		<dep:Part2>1000</dep:Part2>
		<dep:Part3>1</dep:Part3>
		<dep:Part4>5</dep:Part4>
		<dep:PDate></dep:PDate>
	</dep:DPNumber>
	<dep:Resident>
		<OrganizationName>Акционерная компания</OrganizationName>
		<Organizations>
			<INN>1234567890</INN>
			<KPP>123456789</KPP>
		</Organizations>
		<dep:RegDate></dep:RegDate>
	</dep:Resident>
</dep:DPasp>



<dep:PDate></dep:PDate> и <dep:RegDate></dep:RegDate> надо не выводить
...
Рейтинг: 0 / 0
Преобразование xml в xml с помощью XSLT не выводить пустые теги
    #40012447
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новый2
Есть способ убрать их все за раз, чтобы не менять XSLT для каждого элемента?

Именованный шаблон с параметрами для имени элемента и его значения:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<xsl:template name="CreateDepElement">
  <xsl:param name="ElementName" />
  <xsl:param name="ElementText" />
  <xsl:if test="$ElementText">
    <xsl:element name="dep:{$ElementName}" namespace="urn:Information:CommercialFinanceDocuments">
      <xsl:value-of select="$ElementText" />
    </xsl:element>
  </xsl:if>
</xsl:template>


И в основном шаблоне его вызов:
Код: xml
1.
2.
3.
4.
5.
6.
  .........................
  <xsl:call-template name="CreateDepElement">
    <xsl:with-param name="ElementName" select="'RegDate'" />
    <xsl:with-param name="ElementText" select="parent::P_HEAD/DAT_OGRN[1]" />
  </xsl:call-template>
</dep:Resident>


и так для всех элементов, не требующих вывода при отсутствии нужного узла со значением.
...
Рейтинг: 0 / 0
Преобразование xml в xml с помощью XSLT не выводить пустые теги
    #40012508
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Именованный шаблон с параметрами
Зачем?

новый2,

Нужно заменить конструкции
новый2
Код: xml
1.
2.
3.
<dep:RegDate>
  <xsl:value-of select="//DAT_OGRN"/>
</dep:RegDate>


На
Код: xml
1.
<xsl:apply-templates select="//DAT_OGRN"/>


и добавить шаблоны
Код: xml
1.
2.
3.
4.
5.
<xsl:template match="DAT_ORGN">
  <dep:RegDate>
    <xsl:value-of select="."/>
  </dep:RegDate>
</xsl:template>



P.S. Использовать // в XPath крайне неэффективно. На порядок лучше указывать полный путь до элемента. Ну или, в крайнем случае, писать .//
...
Рейтинг: 0 / 0
Преобразование xml в xml с помощью XSLT не выводить пустые теги
    #40012621
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это лишь небольшой кусок. Оригинальный xslt гораздо больше. Идея была - может в конце какой шаблон приписать, чтобы во все элементы не прописывать возможность отсутствия значение. Любой тег без значения не надо выводить
...
Рейтинг: 0 / 0
Преобразование xml в xml с помощью XSLT не выводить пустые теги
    #40012649
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новый2
. Идея была - может в конце какой шаблон приписать
Если бы вы использовали шаблоны, то это могло бы помочь. Но вы обращаетесь ко всем элементам напрямую
новый2
Оригинальный xslt гораздо больше.
Ну придется вам переписать кусок побольше
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Преобразование xml в xml с помощью XSLT не выводить пустые теги
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]