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"><</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"></</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
> 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/
LG Daniel
<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
Erkl�re bitte im Detail, wie die derzeitige Eingabe aussieht, welches
Resultat du daf�r haben willst, und welches du im Moment bekommst.
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
> <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.
LG Daniel