2016-08-02 1 views
0

Мое приложение получает файл, который содержит несколько значений в нижнем элементе с именем «si», и мне нужно разбить некоторые из них в подэлементе с именем «ssi», Другое приложение будет принимать только этот способ. Не все «си» будут разбиты на «ssi», только некоторые из них в соответствии с внутренними правилами. Кроме того, все элементы, которые поступают как «ssi» во входном файле, должны быть сгруппированы под «si 999».Как перемещать и форматировать значения элементов в его подэлемент с помощью XSLT/XSL

В xml ниже "si" означает subitem и "ssi" для под-subitem и "sf" для подполя. «sf» появляется только на выходе, и это самый низкий элемент. Это происходит здесь, потому что определенные коды фактически являются группой субкодов, и входной файл не отделяет их как можно меньше, но другое приложение ожидает этого.

Например:

<c:si name="001" value="1234"/> 

должен быть преобразован в

<c:si name="001"> 
<c:ssi name="sf1" value="12"/> 
<c:ssi name="sf2" value="34"/> 
<\c:si> 

в то время как

<c:si name="002" value="abcd"/> 

не будет страдать без изменений, поэтому выход будет точно такой же. Другими словами, существует определенное внутреннее бизнес-правило, в котором говорится, что si 001 на самом деле является объединением двух подкодов, тогда как si 002 - всего лишь один код. Внутренний вход не отображает его, и выход должен очистить его в соответствии с приведенным ниже примером.

И все входные ГНУ должны быть перемещены под названием си = "999"

Например:

<c:ssi name="0001" value="123456"/> 
<c:ssi name="0002" value="abcdef"/> 

стать на выходе XML:

<c:si name="999"> 
<c:ssi name="0001" value="123456"/> 
<c:ssi name="0002" value="abcdef"/> 
</c:si> 

Здесь весь пример:

ввод xml

<c:product xmlns:c="myapp"> 
     <c:item> 
       <c:si name="001" value="1234"/> 
       <c:ssi name="0001" value="123456"/> 
       <c:si name="002" value="abcd"/> 
       <c:ssi name="0002" value="abcdef"/> 
     </c:item> 
     <c:item> 
       <c:si name="001" value="9876"/> 
       <c:ssi name="0001" value="987654"/> 
       <c:si name="002" value="ghij"/> 
       <c:ssi name="0002" value="lmnopq"/> 
     </c:item> 
</c:product> 

Желаемые выходной файл:

<c:product xmlns:c="myapp"> 
     <c:item> 
       <c:si name="001"> 
       <c:ssi name="sf1" value="12"/> 
       <c:ssi name="sf2" value="34"/> 
       <\c:si> 

       <c:si name="002" value="abcd"/> 

       <c:si name="999"> 
       <c:ssi name="0001" value="123456"/> 
       <c:ssi name="0002" value="abcdef"/> 
       <\c:si> 
     </c:item> 
     <c:item> 
       <c:si name="001"> 
       <c:ssi name="sf1" value="98"/> 
       <c:ssi name="sf2" value="76"/> 
       <\c:si> 

       <c:si name="002" value="ghij"/> 

       <c:si name="999"> 
       <c:ssi name="0001" value="987654"/> 
       <c:ssi name="0002" value="lmnopq"/> 
       <\c:si> 
     </c:item> 
</c:product> 

Сегодня я регулируя выход путем анализа входного файла и с помощью несколько временных переменных. Недавно я узнал о XSLT/XSL и нашел удивительным, насколько полезен это в моем сценарии. Если бы это было всего лишь несколько элементов, XSL уже был бы очень полезен, но поскольку это действительно хорошая сумма, это становится еще более подходящим для моего случая. Вы можете себе представить, насколько велико это усилие, когда вы думаете, что я могу иметь до 100 si и до 1000 ssi.

Итак, как я могу перемещать все входящие ssi в si 999 и как я могу применить XSL, который преобразует значение элемента в «sf»? Будет легче упростить приложение, если я могу иметь XSL-файл/блок для каждого преобразования.

+0

На ваш вопрос не ответил? –

ответ

0

IIUC, вы хотите сделать что-то вроде:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:c="myapp"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c:item"> 
    <xsl:copy> 
     <c:si name="001"> 
      <xsl:apply-templates select="c:si[@name='001']"/> 
     </c:si> 
     <xsl:apply-templates select="c:si[not(@name='001')]"/> 
     <c:si name="999"> 
      <xsl:apply-templates select="c:ssi"/> 
     </c:si> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c:si[@name='001']"> 
    <c:ssi name="sf1" value="{substring(@value, 1, 2)}"/> 
    <c:ssi name="sf2" value="{substring(@value, 3, 2)}"/> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что это создает 001 и 999 подразделов, независимо от того, имеют ли они содержание или нет.