私はこのxmlを持っています:
<root>
<row>
<number>1001461</number>
<unit>CAN</unit>
</row>
<row>
<number>1001462</number>
<unit>KG</unit>
</row>
</root>
私のXslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:param name="formid" select="60202" />
<xsl:template match="@* | node()">
<DocumentElement>
<xsl:apply-templates>
<xsl:with-param name="primarykey" select="position()"/>
</xsl:apply-templates>
</DocumentElement>
</xsl:template>
<xsl:template match="row" name="trow">
<xsl:param name="primarykey"/>
<xsl:for-each select="*">
<SaveDataTable>
<KeyName>
<xsl:value-of select="name()"/>
</KeyName>
<KeyValue>
<xsl:value-of select="."/>
</KeyValue>
<PrimaryKey>
<xsl:value-of select="concat('-',$primarykey)"/>
</PrimaryKey>
<FormId>
<xsl:value-of select="$formid"/>
</FormId>
</SaveDataTable>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
期待される出力:(最初の2つ<PrimaryKey>
は-1で、次の2つは-2であることに注意してください。これが、私が必要とする方法です)
<DocumentElement>
<SaveDataTable>
<KeyName>number</KeyName>
<KeyValue>1001461</KeyValue>
<PrimaryKey>-1</PrimaryKey>
<FormId>60202</FormId>
</SaveDataTable>
<SaveDataTable>
<KeyName>unit</KeyName>
<KeyValue>CAN</KeyValue>
<PrimaryKey>-1</PrimaryKey>
<FormId>60202</FormId>
</SaveDataTable>
<SaveDataTable>
<KeyName>number</KeyName>
<KeyValue>1001462</KeyValue>
<PrimaryKey>-2</PrimaryKey>
<FormId>60202</FormId>
</SaveDataTable>
<SaveDataTable>
<KeyName>unit</KeyName>
<KeyValue>KG</KeyValue>
<PrimaryKey>-2</PrimaryKey>
<FormId>60202</FormId>
</SaveDataTable>
</DocumentElement>
基本的に、すべて<row>...</row>
の<PrimaryKey>-1</PrimaryKey>
shouldが1ずつデクリメントされますが、それは発生していません。すべての<PrimaryKey>
要素の値は、-1、-2などではなく-1になります。
===========================================
更新:私はそれを少し動作させますが、それが効率的かどうかはわかりません。
動作中のxslt(改善が必要な場合があります):
<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="formid" select="60202"/>
<xsl:template match="@* | node()">
<DocumentElement>
<xsl:for-each select="row">
<xsl:call-template name="trow">
<xsl:with-param name="primarykey" select="position()"/>
</xsl:call-template>
</xsl:for-each>
</DocumentElement>
</xsl:template>
<xsl:template name="trow">
<xsl:param name="primarykey"/>
<xsl:for-each select="*">
<SaveDataTable>
<KeyName>
<xsl:value-of select="name()"/>
</KeyName>
<KeyValue>
<xsl:value-of select="."/>
</KeyValue>
<PrimaryKey>
<xsl:value-of select="concat('-',$primarykey)"/>
</PrimaryKey>
<FormId>
<xsl:value-of select="$formid"/>
</FormId>
</SaveDataTable>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>