Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Probleme mit Transformation

5 views
Skip to first unread message

Daniel Kräcker

unread,
Jun 16, 2011, 11:40:06 AM6/16/11
to
Hallo,

ich hab folgende xsl:
========================
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/
Transform">
<xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes" /
>
<xsl:variable name="db_columns" as="xs:node-set">
<db_column nextvar=" ">{Version} </db_column>
<db_column nextvar=" ">{ServerVersion} </db_column>
<db_column nextvar=" ">{CreatedAt} </db_column>
<db_column nextvar=" ">AA1 </db_column>
<db_column nextvar="">AA2 </db_column>
</xsl:variable>
<xsl:variable name="contentline" as="xs:string">{Version} 1.0
{ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag
AA2 monday</xsl:variable>
<xsl:template match="/">
<xsl:element name="test">
<xsl:for-each select="nodeset($db_columns)/db_column">
<xsl:variable name="db_columnname" as="xs:string" select="./
text()"></xsl:variable>
<xsl:variable name="db_columnend" as="xs:string?" select="./
@nextvar"></xsl:variable>
<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
<xsl:choose>
<xsl:when test="contains( $db_columnname, '{' )">
<xsl:value-of select="substring-before( substring-
after( normalize-space( $db_columnname ), '{' ), '}' )"></xsl:value-
of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-space( $db_columnname )"></
xsl:value-of>
</xsl:otherwise>
</xsl:choose>
<xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:choose>
<xsl:when test="contains($contentline, $db_columnname)">
<xsl:value-of select="normalize-space( substring-
before( substring-after( $contentline, $db_columnname ),
$db_columnend ) )"></xsl:value-of>
</xsl:when>
</xsl:choose>
<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
<xsl:choose>
<xsl:when test="contains($db_columnname, '{')">
<xsl:value-of select="substring-before( substring-
after( normalize-space( $db_columnname ), '{' ), '}' )"></xsl:value-
of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-space( $db_columnname )"></
xsl:value-of>
</xsl:otherwise>
</xsl:choose>
<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

========================

die Variable "contentline" kommt eigentlich aus einer XML die mit
dieser xsl transformiert werden soll.
Das Ergebnis sieht so aus:

========================

<?xml version="1.0" encoding="UTF-8"?>
<test>
<Version>1.0</Version>
<ServerVersion>2.1.2342</ServerVersion>
<CreatedAt>16.06.2011</CreatedAt>
<AA1>Montag</AA1>
<AA2></AA2>
</test>

========================

Wie müsste ich das Attribut "nextvar" in der Zeile "<db_column
nextvar="">AA2 </db_column>" setzen, dass folgendes Resultat erzielt
wird?

========================

<?xml version="1.0" encoding="UTF-8"?>
<test>
<Version>1.0</Version>
<ServerVersion>2.1.2342</ServerVersion>
<CreatedAt>16.06.2011</CreatedAt>
<AA1>Montag</AA1>
<AA2>monday</AA2>
</test>

========================

Bin gerade irgendwie ratlos :)

Danke i.V.

LG Daniel

Martin Honnen

unread,
Jun 17, 2011, 7:51:20 AM6/17/11
to
Daniel Kr�cker wrote:

> die Variable "contentline" kommt eigentlich aus einer XML die mit
> dieser xsl transformiert werden soll.
> Das Ergebnis sieht so aus:
>
> ========================
>
> <?xml version="1.0" encoding="UTF-8"?>
> <test>
> <Version>1.0</Version>
> <ServerVersion>2.1.2342</ServerVersion>
> <CreatedAt>16.06.2011</CreatedAt>
> <AA1>Montag</AA1>
> <AA2></AA2>
> </test>
>
> ========================
>

> Wie m�sste ich das Attribut "nextvar" in der Zeile "<db_column


> nextvar="">AA2</db_column>" setzen, dass folgendes Resultat erzielt
> wird?
>
> ========================
>
> <?xml version="1.0" encoding="UTF-8"?>
> <test>
> <Version>1.0</Version>
> <ServerVersion>2.1.2342</ServerVersion>
> <CreatedAt>16.06.2011</CreatedAt>
> <AA1>Montag</AA1>
> <AA2>monday</AA2>
> </test>

Mit Saxon 9.3 und dem Stylesheet

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">


<xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes" />
<xsl:variable name="db_columns">

<db_column nextvar=" ">{Version} </db_column>
<db_column nextvar=" ">{ServerVersion} </db_column>
<db_column nextvar=" ">{CreatedAt} </db_column>
<db_column nextvar=" ">AA1 </db_column>
<db_column nextvar="">AA2 </db_column>
</xsl:variable>
<xsl:variable name="contentline" as="xs:string">{Version} 1.0
{ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag
AA2 monday</xsl:variable>
<xsl:template match="/">
<xsl:element name="test">

<xsl:for-each select="$db_columns/db_column">


<xsl:variable name="db_columnname" as="xs:string" select="./
text()"></xsl:variable>
<xsl:variable name="db_columnend" as="xs:string?" select="./
@nextvar"></xsl:variable>

<xsl:element name="{translate(normalize-space($db_columnname),
'{{}}', '')}">
<xsl:variable name="pattern" as="xs:string"
select="concat(replace(normalize-space($db_columnname), '[{}]', '\\$0'),
'\s+(\S+)')"/>
<xsl:analyze-string select="$contentline" regex="{$pattern}">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:element>


</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>


erhalte ich als Resultat

<test>
<Version>1.0</Version>
<ServerVersion>2.1.2342</ServerVersion>
<CreatedAt>16.06.2011</CreatedAt>
<AA1>Montag</AA1>
<AA2>monday</AA2>
</test>

nextvar braucht es so nicht.


--

Martin Honnen --- MVP Data Platform Development
http://msmvps.com/blogs/martin_honnen/

Daniel Kräcker

unread,
Jun 17, 2011, 12:06:27 PM6/17/11
to
Danke!

LG Daniel

Daniel Kräcker

unread,
Jun 22, 2011, 11:39:18 AM6/22/11
to
Ich muss doch noch mal etwas nachschieben ...

<xsl:variable name="contentline" as="xs:string">{Version} 1.0
{ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag

AA2 monday AA3 CC1 CC2 2011-06-21 00:00:00 CC3 abc 5 CC4</
xsl:variable>

Wenn die eingehenden Daten etwas anders aussehen funktioniert die
Lösung leider nicht richtig.

z.B. AA3 enthält dann CC1 als Wert
CC1 enthält dann CC2 als Wert
CC2 enthält nur 2011 als Wert
und CC3 enthält "abc 5" (1 Leerzeichen) statt "abc 5" ( 2
Leerzeichen )

Habt ihr eventuell noch mal 'nen Tipp?

LG Daniel

Martin Honnen

unread,
Jun 22, 2011, 12:01:08 PM6/22/11
to
Daniel Kr�cker wrote:
> Ich muss doch noch mal etwas nachschieben ...
>
> <xsl:variable name="contentline" as="xs:string">{Version} 1.0
> {ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag
> AA2 monday AA3 CC1 CC2 2011-06-21 00:00:00 CC3 abc 5 CC4</
> xsl:variable>
>
> Wenn die eingehenden Daten etwas anders aussehen funktioniert die
> L�sung leider nicht richtig.
>
> z.B. AA3 enth�lt dann CC1 als Wert
> CC1 enth�lt dann CC2 als Wert
> CC2 enth�lt nur 2011 als Wert
> und CC3 enth�lt "abc 5" (1 Leerzeichen) statt "abc 5" ( 2

> Leerzeichen )
>
> Habt ihr eventuell noch mal 'nen Tipp?

Erkl�re bitte im Detail, wie die derzeitige Eingabe aussieht, welches
Resultat du daf�r haben willst, und welches du im Moment bekommst.

Daniel Kräcker

unread,
Jun 23, 2011, 3:24:00 AM6/23/11
to
Hallo,

also die XSL sieht so aus:

========================

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/
Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-
prefixes="xs">
<xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes" /
>
<xsl:variable name="db_columns">

<db_column>{Version}</db_column>
<db_column>{ServerVersion}</db_column>
<db_column>{CreatedAt}</db_column>
<db_column>AA1</db_column>
<db_column>AA2</db_column>
<db_column>AA3</db_column>
<db_column>CC1</db_column>
<db_column>CC2</db_column>
<db_column>CC3</db_column>
<db_column>CC4</db_column>
</xsl:variable>


<xsl:variable name="contentline" as="xs:string">{Version} 1.0
{ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag
AA2 monday AA3 CC1 CC2 2011-06-21 00:00:00 CC3 abc 5 CC4 </
xsl:variable>

<xsl:template match="/">
<xsl:element name="test">
<xsl:for-each select="$db_columns/db_column">
<xsl:variable name="db_columnname" as="xs:string" select="./
text()"></xsl:variable>

<xsl:element name="{translate(normalize-
space($db_columnname),'{{}}', '')}">


<xsl:variable name="pattern" as="xs:string"
select="concat(replace(normalize-space($db_columnname), '[{}]', '\\
$0'),'\s+(\S+)')" />
<xsl:analyze-string select="$contentline" regex="{$pattern}">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)" />
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

========================

Das Ergebnis sieht so aus:

========================

<?xml version="1.0" encoding="UTF-8"?>
<test>
<Version>1.0</Version>
<ServerVersion>2.1.2342</ServerVersion>
<CreatedAt>16.06.2011</CreatedAt>
<AA1>Montag</AA1>

<AA2>monday</AA2>
<AA3>CC1</AA3>
<CC1>CC2</CC1>
<CC2>2011-06-21</CC2>
<CC3>abc</CC3>
<CC4/>
</test>

========================

eigentlich hätte ich folgendes erwartet:

========================

<?xml version="1.0" encoding="UTF-8"?>
<test>
<Version>1.0</Version>
<ServerVersion>2.1.2342</ServerVersion>

<CreatedAt>16.06.2011 13:51:35</CreatedAt>


<AA1>Montag</AA1>
<AA2>monday</AA2>

<AA3/>
<CC1/>
<CC2>2011-06-21 00:00:00</CC2>
<CC3>abc 5</CC3>
<CC4/>
</test>
========================

LG Daniel

Martin Honnen

unread,
Jun 23, 2011, 7:17:35 AM6/23/11
to
Daniel Kr�cker wrote:

> <xsl:variable name="pattern" as="xs:string"
> select="concat(replace(normalize-space($db_columnname), '[{}]', '\\
> $0'),'\s+(\S+)')" />
> <xsl:analyze-string select="$contentline" regex="{$pattern}">
> <xsl:matching-substring>
> <xsl:value-of select="regex-group(1)" />
> </xsl:matching-substring>
> </xsl:analyze-string>

> Das Ergebnis sieht so aus:


>
> ========================
>
> <?xml version="1.0" encoding="UTF-8"?>
> <test>
> <Version>1.0</Version>
> <ServerVersion>2.1.2342</ServerVersion>
> <CreatedAt>16.06.2011</CreatedAt>
> <AA1>Montag</AA1>
> <AA2>monday</AA2>
> <AA3>CC1</AA3>
> <CC1>CC2</CC1>
> <CC2>2011-06-21</CC2>
> <CC3>abc</CC3>
> <CC4/>
> </test>
>
> ========================
>

> eigentlich h�tte ich folgendes erwartet:


>
> ========================
>
> <?xml version="1.0" encoding="UTF-8"?>
> <test>
> <Version>1.0</Version>
> <ServerVersion>2.1.2342</ServerVersion>
> <CreatedAt>16.06.2011 13:51:35</CreatedAt>
> <AA1>Montag</AA1>
> <AA2>monday</AA2>
> <AA3/>
> <CC1/>
> <CC2>2011-06-21 00:00:00</CC2>
> <CC3>abc 5</CC3>
> <CC4/>
> </test>

In deinem vorherigem Beispiel hatten die Werte, die extrahiert werden
sollten, keine Leerzeichen, deshalb hatte ich einfach den regul�ren
Ausdruck '\s+(\S+)' benutzt, der mit \S+ einfach alles ausliest, was
nicht "white space" ist. Da du aber jetzt Werte hast, die Leerzeichen
enthalten k�nnen, klappt das nicht.
Als alternativen Ansatz kann man eventuell

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">


<xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes" />
<xsl:variable name="db_columns">
<db_column>{Version}</db_column>
<db_column>{ServerVersion}</db_column>
<db_column>{CreatedAt}</db_column>
<db_column>AA1</db_column>
<db_column>AA2</db_column>
<db_column>AA3</db_column>
<db_column>CC1</db_column>
<db_column>CC2</db_column>
<db_column>CC3</db_column>
<db_column>CC4</db_column>
</xsl:variable>
<xsl:variable name="contentline" as="xs:string">{Version} 1.0
{ServerVersion} 2.1.2342 {CreatedAt} 16.06.2011 13:51:35 AA1 Montag

AA2 monday AA3 CC1 CC2 2011-06-21 00:00:00 CC3 abc 5 CC4 </xsl:variable>
<xsl:template match="/">


<test>
<xsl:for-each select="$db_columns/db_column">
<xsl:variable name="db_columnname" as="xs:string"

select="."></xsl:variable>
<xsl:variable name="following-col" as="xs:string?"
select="following-sibling::db_column[1]"/>
<xsl:element
name="{translate(normalize-space($db_columnname),'{{}}', '')}">


<xsl:variable
name="pattern"
as="xs:string"
select="concat(replace(normalize-space($db_columnname),
'[{}]', '\\$0'),

'\s+(.*?)(',
replace(normalize-space($following-col),
'[{}]', '\\$0'),
'|$)')" />


<xsl:analyze-string select="$contentline" regex="{$pattern}">
<xsl:matching-substring>

<xsl:value-of select="replace(regex-group(1), '(^\s+|\s+$)', '')" />


</xsl:matching-substring>
</xsl:analyze-string>
</xsl:element>
</xsl:for-each>

</test>
</xsl:template>
</xsl:stylesheet>


dabei wird dann als "Wert" alles vor dem n�chsten Spaltennamen ausgelesen.

Daniel Kräcker

unread,
Jun 27, 2011, 3:08:07 AM6/27/11
to
Danke!

LG Daniel

0 new messages