xslt : 컨텍스트 노드 및 @ 값이 동일한 다른 노드의 속성 값 다시 번호 매기기

나쁜 사람

이 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 종류의 기능을 가진 일종의 맵을 만드는 방법이 있습니까?

감사!

Martin Honnen

해당 없음 또는 a 없이 source각각에 대한 주석을 생성할지 여부 는 다음과 같이 모두 생성됩니다.newsourcetargettargetsource

<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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

서로 다른 두 노드의 속성 값으로 XSLT 일치

분류에서Dev

XSLT, 부모 노드 속성이 다른 노드의 속성 값과 일치 할 때 자식 노드에 대한 변환 수행

분류에서Dev

XSLT-다른 노드 목록에 속성 값이있는 한 노드 목록의 속성 합계를 찾는 방법

분류에서Dev

다른 노드의 값에 따라 XSLT 변경 값 노드

분류에서Dev

Matlab에서 행렬의 연속 된 동일한 값 번호 다시 매기기

분류에서Dev

XSLT-다른 컨텍스트에서 노드 만들기

분류에서Dev

XSLT-다른 노드에 따라 XML 노드의 값 수정

분류에서Dev

XSLT 노드에 속성 값이 있으면 형제 노드에 넣습니다.

분류에서Dev

XSLT 다른 노드의 속성을 기반으로 노드 제거

분류에서Dev

모든 xml 노드의 특정 속성 값을 다른 파일로 내보내기

분류에서Dev

XPath-속성 값 또는 텍스트 노드의 일부만 가져옵니다.

분류에서Dev

XSLT는 다른 노드의 요소 값을 비교-성능 문제

분류에서Dev

XSLT : 다른 노드에서 노드 값을 찾는 방법

분류에서Dev

XSL에 의해 HTML 스타일 속성 값에서 속성 노드 만들기

분류에서Dev

다른 노드의 값을 기반으로 한 노드의 값을 가져 오는 방법

분류에서Dev

XSLT 2.0 : 연속 텍스트 노드에서 장 번호 및 설명을 열거하는 RegEx 만들기

분류에서Dev

XSLT를 사용하여 속성 값을 기반으로 2 개의 XML 파일 (노드 속성 포함) 병합

분류에서Dev

노드 측정 실행 시간-다른 함수에 매개 변수로 전달 된 비동기의 반환 값

분류에서Dev

반복 노드에서 노드의 값을 다른 노드로 복사하는 XSLT

분류에서Dev

XSLT를 사용하여 다른 노드의 값 결합

분류에서Dev

노드 복사 및 XSLT의 값 바꾸기

분류에서Dev

다른 노드의 속성에 따른 속성 값을 사용하여 노드 선택

분류에서Dev

다른 노드의 값을 기반으로하는 노드의 XPath?

분류에서Dev

XSLT : 첫 번째 노드 선택 및 텍스트 바꾸기

분류에서Dev

속성으로 노드 값을 가져 오는 xpath가 다른 노드의 값과 같습니다.

분류에서Dev

동일한 이벤트 및 노드의 이벤트 처리기는 역순으로 실행됩니다.

분류에서Dev

xslt로 노드를 그룹화하고 동일한 값을 삭제합니다.

분류에서Dev

현재 노드의 특정 속성 값을 기반으로 XML 파일에 링크 된 텍스트 선택

분류에서Dev

익스프레스 노드 서버는 비동기 클라이언트 호출에 값을 반환합니다.

Related 관련 기사

  1. 1

    서로 다른 두 노드의 속성 값으로 XSLT 일치

  2. 2

    XSLT, 부모 노드 속성이 다른 노드의 속성 값과 일치 할 때 자식 노드에 대한 변환 수행

  3. 3

    XSLT-다른 노드 목록에 속성 값이있는 한 노드 목록의 속성 합계를 찾는 방법

  4. 4

    다른 노드의 값에 따라 XSLT 변경 값 노드

  5. 5

    Matlab에서 행렬의 연속 된 동일한 값 번호 다시 매기기

  6. 6

    XSLT-다른 컨텍스트에서 노드 만들기

  7. 7

    XSLT-다른 노드에 따라 XML 노드의 값 수정

  8. 8

    XSLT 노드에 속성 값이 있으면 형제 노드에 넣습니다.

  9. 9

    XSLT 다른 노드의 속성을 기반으로 노드 제거

  10. 10

    모든 xml 노드의 특정 속성 값을 다른 파일로 내보내기

  11. 11

    XPath-속성 값 또는 텍스트 노드의 일부만 가져옵니다.

  12. 12

    XSLT는 다른 노드의 요소 값을 비교-성능 문제

  13. 13

    XSLT : 다른 노드에서 노드 값을 찾는 방법

  14. 14

    XSL에 의해 HTML 스타일 속성 값에서 속성 노드 만들기

  15. 15

    다른 노드의 값을 기반으로 한 노드의 값을 가져 오는 방법

  16. 16

    XSLT 2.0 : 연속 텍스트 노드에서 장 번호 및 설명을 열거하는 RegEx 만들기

  17. 17

    XSLT를 사용하여 속성 값을 기반으로 2 개의 XML 파일 (노드 속성 포함) 병합

  18. 18

    노드 측정 실행 시간-다른 함수에 매개 변수로 전달 된 비동기의 반환 값

  19. 19

    반복 노드에서 노드의 값을 다른 노드로 복사하는 XSLT

  20. 20

    XSLT를 사용하여 다른 노드의 값 결합

  21. 21

    노드 복사 및 XSLT의 값 바꾸기

  22. 22

    다른 노드의 속성에 따른 속성 값을 사용하여 노드 선택

  23. 23

    다른 노드의 값을 기반으로하는 노드의 XPath?

  24. 24

    XSLT : 첫 번째 노드 선택 및 텍스트 바꾸기

  25. 25

    속성으로 노드 값을 가져 오는 xpath가 다른 노드의 값과 같습니다.

  26. 26

    동일한 이벤트 및 노드의 이벤트 처리기는 역순으로 실행됩니다.

  27. 27

    xslt로 노드를 그룹화하고 동일한 값을 삭제합니다.

  28. 28

    현재 노드의 특정 속성 값을 기반으로 XML 파일에 링크 된 텍스트 선택

  29. 29

    익스프레스 노드 서버는 비동기 클라이언트 호출에 값을 반환합니다.

뜨겁다태그

보관