이 XML이 주어지면
<?xml version="1.0"?>
<root>
<lev1>
<source id="1"/>
<target id="1"/>
</lev1>
<lev1>
<source id="2"/>
<sometag/>
<lev2>
<sometag/>
<target id="2"/>
<target id="4"/>
</lev2>
<source id="4"/>
<sometag/>
<source id="5"/>
<lev2>
<target id="6"/>
</lev2>
</lev1>
</root>
모든 source/@id
값의 번호를 다시 매기고 target/@id
업데이트 된 값과 일치하는 항목 을 업데이트 하고 싶습니다 . 모든 노드가 원래 위치를 유지하고 일치하는 항목 target/@id
이없는 주석을 생성하고 싶습니다 .
이 xslt는 내 출발점이었습니다.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kTarget" match="target" use="@id"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="source">
<xsl:variable name="newId">
<xsl:number from="/" level="any"/>
</xsl:variable>
<newsource>
<xsl:attribute name="id"><xsl:value-of select="$newId"/></xsl:attribute>
</newsource>
<xsl:call-template name="renumTarget">
<xsl:with-param name="newId"><xsl:value-of select="$newId"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="target"/>
<xsl:template name="renumTarget">
<xsl:param name="newId"/>
<xsl:comment>new id : <xsl:value-of select="$newId"/> old id : <xsl:value-of select="@id"/></xsl:comment>
<xsl:element name="newtarget">
<xsl:attribute name="id"><xsl:value-of select="$newId"/></xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
이전 값과 새 값을 선택할 수 있지만 새 노드를 배치 할 수는 없습니다. 또한 일치하는 @id가없는 영역을 식별하지 않습니다.
xslt에서 oldVal-> newVal 종류의 기능을 가진 일종의 맵을 만드는 방법이 있습니까?
감사!
해당 없음 또는 a 없이 source
각각에 대한 주석을 생성할지 여부 는 다음과 같이 모두 생성됩니다.newsource
target
target
source
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="kTarget" match="target" use="@id"/>
<xsl:key name="kSource" match="source" use="@id"/>
<xsl:template match="node() | @*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="source" mode="number">
<xsl:number level="any"/>
</xsl:template>
<xsl:template match="source">
<xsl:variable name="newId">
<xsl:apply-templates select="." mode="number"/>
</xsl:variable>
<newsource id="{$newId}"/>
<xsl:if test="not(key('kTarget', @id))">
<xsl:comment>
<xsl:value-of select="concat('No target for old id ', @id, ' replaced by ', $newId)"/>
</xsl:comment>
</xsl:if>
</xsl:template>
<xsl:template match="target[key('kSource', @id)]">
<xsl:variable name="changed-id">
<xsl:apply-templates select="key('kSource', @id)" mode="number"/>
</xsl:variable>
<target id="{$changed-id}"/>
</xsl:template>
<xsl:template match="target[not(key('kSource', @id))]">
<xsl:call-template name="identity"/>
<xsl:comment>
<xsl:value-of select="concat('No source for target with id ', @id)"/>
</xsl:comment>
</xsl:template>
</xsl:stylesheet>
입력 샘플에 적용하면 출력을 얻습니다.
<root>
<lev1>
<newsource id="1"/>
<target id="1"/>
</lev1>
<lev1>
<newsource id="2"/>
<sometag/>
<lev2>
<sometag/>
<target id="2"/>
<target id="3"/>
</lev2>
<newsource id="3"/>
<sometag/>
<newsource id="4"/><!--No target for old id 5 replaced by 4-->
<lev2>
<target id="6"/><!--No source for target with id 6-->
</lev2>
</lev1>
</root>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다