2012-07-18 1 views
1

xslt имеет функцию (например, подстроку наоборот) или как ее решить? Я имел XML:Как вставить xml nodet в определенных точках

<document> 
<Line> 
    <Line-Item> 
     <LineNumber>10</LineNumber> 
     <EAN>111</EAN> 
     <BIC>123123</BIC> 
     <SIC>AVD091</SIC> 
    </Line-Item> 
</Line> 
<Line> 
    <Line-Item> 
     <LineNumber>20</LineNumber> 
     <EAN>22222</EAN> 
     <BIC>3232332</BIC> 
     <SIC>AVD25482</SIC> 
    </Line-Item> 
</Line> 
</document> 

необходим выход:

10  111  123123  AVD091 
20  22222 3232332  AVD25482 

поле старта номер строки с 1 позиции столбца, EAN начать с 11 позиции на колонке, BIC начала с 19 и SIC от 31.

+0

XSLT 1.0 или 2.0? –

+0

XSLT 1.0 таблица стилей – Petras

ответ

2

Попробуйте этот стиль XSLT 1.0. Шаблон площадки представляет собой версию XSLT 1.0 функции mf: pad для Martin.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="document/Line/Line-Item"/> 
</xsl:template> 

<xsl:template name="pad"> 
    <xsl:param name="value" /> 
    <xsl:param name="width" /> 
    <xsl:variable name="col-max" select="'     '"/> 
    <xsl:value-of select="substring(concat($value,$col-max), 1, $width)" /> 
</xsl:template> 

<xsl:template match="Line-Item" > 

<xsl:call-template name="pad" > 
    <xsl:with-param name="value" select="LineNumber"/> 
    <xsl:with-param name="width" select="10" /> 
</xsl:call-template> 

<xsl:call-template name="pad" > 
    <xsl:with-param name="value" select="EAN"/> 
    <xsl:with-param name="width" select="8" /> 
</xsl:call-template> 

<xsl:call-template name="pad" > 
    <xsl:with-param name="value" select="BIC"/> 
    <xsl:with-param name="width" select="12" /> 
</xsl:call-template> 

<xsl:value-of select="SIC" /> 

<xsl:value-of select="'&#x0A;'" /> 
</xsl:template> 

<xsl:template match="*" /> 
</xsl:stylesheet> 
+0

Спасибо за ответ. Я буду использовать его. – Petras

1

Вот пример таблицы стилей (XSLT 2.0, извините, начал писать до того, как ваш комментарий указал запрос на 1.0):

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs mf"> 

<xsl:param name="col-max" as="xs:string" select="'     '"/> 

<xsl:strip-space elements="*"/> 
<xsl:output method="text"/> 

<xsl:function name="mf:pad" as="xs:string"> 
    <xsl:param name="input" as="xs:string"/> 
    <xsl:param name="col-length" as="xs:integer"/> 
    <xsl:sequence select="concat($input, substring($col-max, 1, $col-length - string-length($input)))"/> 
</xsl:function> 

<xsl:template match="Line"> 
    <xsl:if test="position() > 1"> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:if> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="LineNumber"> 
    <xsl:sequence select="mf:pad(., 10)"/> 
</xsl:template> 

<xsl:template match="EAN"> 
    <xsl:sequence select="mf:pad(., 9)"/> 
</xsl:template> 

<xsl:template match="BIC"> 
    <xsl:sequence select="mf:pad(., 12)"/> 
</xsl:template> 

<xsl:template match="SIC"> 
    <xsl:sequence select="mf:pad(., string-length())"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

спасибо, что посмотрели. – Petras

2

Это краткое и общее преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<my:fields> 
    <fieldset name="LineNumber" width="10"/> 
    <fieldset name="EAN" width="8"/> 
    <fieldset name="BIC" width="12"/> 
</my:fields> 

<xsl:variable name="vSpaces" select="'     '"/> 

<xsl:variable name="vFields" select="document('')/*/my:fields/*"/> 

<xsl:template match="Line-Item"> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="Line-Item/*"> 
    <xsl:value-of select= 
    "concat(., 
      substring($vSpaces, 
        1, 
         $vFields[@name = name(current())]/@width 
        - 
         string-length() 
        ) 
      )"/> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML:

<document> 
    <Line> 
     <Line-Item> 
      <LineNumber>10</LineNumber> 
      <EAN>111</EAN> 
      <BIC>123123</BIC> 
      <SIC>AVD091</SIC> 
     </Line-Item> 
    </Line> 
    <Line> 
     <Line-Item> 
      <LineNumber>20</LineNumber> 
      <EAN>22222</EAN> 
      <BIC>3232332</BIC> 
      <SIC>AVD25482</SIC> 
     </Line-Item> 
    </Line> 
</document> 

производит разыскиваемый, правильный результат:

10  111  123123  AVD091 
20  22222 3232332  AVD25482 

Обратите внимание:

Элемент my:fields можно поместить в свой собственный документ XML. Таким образом, никакие модификации не потребуются для кода XSLT, если необходимо изменить некоторые ширины полей.

+0

благодарю вас за ответ! – Petras

+0

@Petras: Добро пожаловать. Пожалуйста, подумайте о принятии более короткого и более общего решения. –